通过python中的第一个(或第二个,或其他)列对文件进行排序

时间:2015-12-08 14:13:42

标签: python python-2.7 sorting

这似乎是一个非常基本的问题,但我是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()

它不会给我任何错误,但只是将输出文件写为输入文件。

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

非常感谢!

修改

我打开文件的方式有问题,所以关于已经打开过的数组的答案真的没什么帮助。

6 个答案:

答案 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