Python 快速重新排列文本文件
我编写了以下代码以按给定顺序重写文本文件。此顺序在Python 快速重新排列文本文件,python,multithreading,text,file-io,parallel-processing,Python,Multithreading,Text,File Io,Parallel Processing,我编写了以下代码以按给定顺序重写文本文件。此顺序在gA中指定gA是一个列表:[[fN0,value0],[fN1,value1]…]。我按值对这个列表进行了排序,并希望按照这个顺序写出 我的代码工作正常,但输入速度非常慢(我有一个5000万行的输入,需要2个月的时间来处理)。因此,我正在寻找方法来加快这一代码。任何想法都欢迎 for k in gA: fN = k[0] for lineNum, line in enumerate(slicedFile,start=0):
gA
中指定gA
是一个列表:[[fN0,value0],[fN1,value1]…]
。我按值对这个列表进行了排序,并希望按照这个顺序写出
我的代码工作正常,但输入速度非常慢(我有一个5000万行的输入,需要2个月的时间来处理)。因此,我正在寻找方法来加快这一代码。任何想法都欢迎
for k in gA:
fN = k[0]
for lineNum, line in enumerate(slicedFile,start=0):
num, restOfLine = line.split('\t',1)
if num == fN:
out.write(line)
inp.seek(0)
您应该将整个文件读入内存,并将所有行放在
num
的dict
中,指向开头有num
的行的列表。然后,您可以在gA
中迭代一次,并打印该dict
中的所有行:
from collections import defaultdict
lines = defaultdict(list)
for line in slicedFile:
num, restOfLine = line.split('\t', 1)
lines[num].append(line)
for fN, dummy in gA:
for line in lines[fN]:
out.write(line)
注意:我使用defaultdict
只是为了缩短代码。如果在这样一个defaultdict
中使用了一个不存在的元素,它会自动创建(在本例中是一个list
),因此我可以在元素上调用.append()
。gA
的意义是什么?您不是只想根据num
的值对文件中的行进行排序吗?为什么要enumerate()
?您没有使用lineNum
。这是故意的还是我指的是你想改变的东西?@JayanthKoushik实际上,num的值是不同行的ID(每行都以num开头,这是我识别它们的方式)@Alfe要诚实,我列举,因为我习惯这样做。否则您将如何继续?如果您不需要计算,只需对slicedFile中的line使用,
而不是对enumerate(slicedFile,start=0)中的lineNum使用:
。