这似乎是一个非常基本的问题,但我是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()
它不会给我任何错误,但只是将输出文件写为输入文件。
我知道这肯定是一个非常基本的错误,但如果你们中的一些人可以告诉我我做错了什么,那就太棒了!
非常感谢!
我打开文件的方式有问题,所以关于已经打开过的数组的答案真的没什么帮助。
答案 0 :(得分:5)
如果输入文件以制表符分隔,则还可以使用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)
按不同的列排序。
答案 1 :(得分:2)
您遇到的问题是您没有将每行转换为列表。当您在文件中阅读时,您只需将整行作为字符串。然后,按照每行的第一个字符进行排序,输入中的字符始终为'E'
。
要按第一列排序,您需要关闭第一个块,然后只读取该部分。所以你的关键应该是:
for line in sorted(lines, key=lambda line: line.split()[0]):
split
会将您的行转换为列表,然后从该列表中获取第一列。
答案 2 :(得分:1)
与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()
答案 3 :(得分:1)
您可以编写一个函数,使用csv.reader
解析文件来对文件名,分隔符和列进行排序:
from operator import itemgetter
import csv
def sort_by(fle,col,delim):
with open(fle) as f:
r = csv.reader(f, delim=delim)
for row in sorted(r, key=itemgetter(col)):
yield row
for row in sort_by("your_file",2, "\t"):
print(row)
答案 4 :(得分:1)
您可以使用pandas快速执行此操作,并在显示时将数据文件设置为 (即,使用可变空格作为分隔符):
import pandas as pd
df = pd.read_csv('csvdata.csv', sep=' ', skipinitialspace=True, header=None)
df.sort(columns=[0], inplace=True)
df.to_csv('sorted_csvdata.csv', header=None, index=None)
只是检查结果:
with open('sorted_csvdata.csv', 'r') as f:
print(f.read())
ENSMUSG00000028255,145003817,145032776,3,protein_coding
ENSMUSG00000028255,145003817,145032776,3,processed_transcript
ENSMUSG00000028255,145003817,145032776,3,processed_transcript
ENSMUSG00000077677,101186764,101186867,4,snRNA
ENSMUSG00000088009,83405631,83405764,14,snoRNA
ENSMUSG00000092727,68990574,68990678,11,miRNA
ENSMUSG00000097075,126971720,126976098,7,lincRNA
ENSMUSG00000097075,126971720,126976098,7,lincRNA
ENSMUSG00000098481,38086202,38086317,13,miRNA
ENSMUSG00000098737,95734911,95734973,3,miRNA
您可以通过在colmuns = [...]关键字参数的列表中添加其他列来进行多列排序。
答案 5 :(得分:0)
这是另一种选择。与上述某些想法类似。基本上,mysort是一个功能,它将基于此为您进行自定义排序
def mysort(line):
return line.split()[0]
with open("records.txt", "r") as f:
text = f.readlines()
for line in sorted(text, key=mysort):
print line