在python中按第一列(或第二列或其他列)对文件排序

2024-06-01 21:40:23 发布

您现在位置:Python中文网/ 问答频道 /正文

这似乎是一个非常基本的问题,但我对python还不太熟悉,在花了很长时间试图自己找到解决方案之后,我想是时候问问更高级的人了!

所以,我有一个文件(示例):

ENSMUSG00000098737  95734911    95734973    3   miRNA
ENSMUSG00000077677  101186764   101186867   4   snRNA
ENSMUSG00000092727  68990574    68990678    11  miRNA
ENSMUSG00000088009  83405631    83405764    14  snoRNA
ENSMUSG00000028255  145003817   145032776   3   protein_coding
ENSMUSG00000028255  145003817   145032776   3   processed_transcript
ENSMUSG00000028255  145003817   145032776   3   processed_transcript
ENSMUSG00000098481  38086202    38086317    13  miRNA
ENSMUSG00000097075  126971720   126976098   7   lincRNA
ENSMUSG00000097075  126971720   126976098   7   lincRNA

我需要写一个包含所有相同信息的新文件,但按第一列排序。

到目前为止,我使用的是:

lines = open(my_file, 'r').readlines()
output = open("intermediate_alphabetical_order.txt", 'w')

for line in sorted(lines, key=itemgetter(0)):
    output.write(line)

output.close()

它不会返回任何错误,但只是将输出文件与输入文件完全一样写入。

我知道这肯定是一个非常基本的错误,但如果你们中的一些人能告诉我我做错了什么,那就太神奇了!

非常感谢!

编辑

我在打开文件的方式上遇到了问题,所以关于已经打开的数组的答案并没有真正的帮助。


Tags: 文件示例output错误lineopen解决方案lines
3条回答

与SuperBiasedMan的想法相同,但我更喜欢这种方法:如果您想要另一种排序方式(例如:如果第一列匹配,则按第二列排序,然后按第三列排序等),则更容易实现

with open(my_file) as f:
    lines = [line.split(' ') for line in f]
output = open("result.txt", 'w')

for line in sorted(lines):
    output.write(' '.join(line), key=itemgetter(0))

output.close()

你的问题是你没有把每一行都变成一个列表。当你读入文件时,你得到的只是整个行的字符串。然后按每行的第一个字符进行排序,这始终是输入中的相同字符,'E'

要按第一列排序,您需要将第一个块分割开来,然后阅读该部分。所以你的关键应该是:

for line in sorted(lines, key=lambda line: line.split()[0]):

split将把您的行变成一个列表,然后从该列表中获取第一列。

如果输入文件是制表符分隔的,也可以使用csv模块。

import csv
from operator import itemgetter
reader = csv.reader(open("t.txt"), delimiter="\t")

for line in sorted(reader, key=itemgetter(0)):
    print(line)

按第一列排序。

在中更改号码

key=itemgetter(0)

用于按不同列排序。

相关问题 更多 >