通過文件遍歷多次是可能的(您可以通過調用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