通过文件遍历多次是可能的(您可以通过调用thefile.seek()
来重置文件,但可能是很昂贵。
比方说,你有一个函数来确定给定行键号一般性,e.g
def getkey(line):
return line.split()[1]
在你的例子,其中的关键是在三号线空格分开的话第二
。现在,如果对第二个文件中的数据将舒适地适合RAM(所以到几GB - 认为这将需要多长时间重复几百次对是 - !)...:
key2line = {}
with open(secondfile) as f:
for line in f:
key2line[getkey(line)] = line
with open(firstfile) as f:
order = [line.strip() for line in f]
with open(outputfile, 'w') as f:
for key in order:
f.write(key2line[key])
现在是不是一个非常明确和有效的方法...?
如果第二个文件太大了一个小的因素,比如说10倍左右,你实际上可以放进内存中的东西,那么你仍然可以在文件中大量跳转的情况下解决它,通过使用寻找和告诉。
第一个环路将成为:
key2offset = {}
with open(secondfile) as f:
offset = 0
for line in f:
new_offset = f.tell()
key2line[getkey(line)] = offset
offset = new_offset
和最后一个循环将成为:
with open(secondfile) as f:
with open(outputfile, 'w') as f1:
for key in order:
f.seek(key2offset[key])
line = f.readline()
f1.write(line)
复杂一点,多慢 - 但仍然方式比重新快 - 读数十亿次,一遍又一遍,一个数十GB的文件!)
[f.seek()和f.tell()t o阅读文本文件的每一行](http://stackoverflow.com/questions/15594817/f-seek-and-f-tell-to-read-each-line-of-text-file) – ha9u63ar 2015-03-18 23:11:18
请不要只是要求我们为你解决问题。告诉我们你是如何试图自己解决问题的,然后向我们展示结果是什么,并告诉我们为什么你觉得它不起作用。请参阅“[您尝试过什么?](http://whathaveyoutried.com/)”,以获得一篇您最近需要阅读的优秀文章。 – 2015-03-19 01:25:09