2016-03-01 154 views
0

假設我有一個包含48,222行的文件。然後我給出一個指數值,比方說21,000。將文件的某些部分「移動」到另一個文件

Python中是否有任何方式可以從索引21,000開始「移動」文件的內容,現在我有兩個文件:原始文件和新文件。但是原來的一條現在有21,000條線和新的27,222條線。

我讀這post它使用的分區,是相當描述我想要什麼:

with open("inputfile") as f: 
    contents1, sentinel, contents2 = f.read().partition("Sentinel text\n") 
with open("outputfile1", "w") as f: 
    f.write(contents1) 
with open("outputfile2", "w") as f: 
    f.write(contents2) 

只是(1)它使用「哨兵文本」作爲分隔符,(2),它創建了兩個新的文件,需要我刪除舊文件。截至目前,我這樣做的方式是這樣的:

for r in result.keys(): #the filenames are in my dictionary, don't bother that 
    f = open(r) 
    lines = f.readlines() 
    f.close() 
    with open("outputfile1.txt", "w") as fn: 
     for line in lines[0:21000]: 
      #write each line 
    with open("outputfile2.txt", "w") as fn: 
     for line in lines[21000:]: 
      #write each line     

這是一個相當手動的工作。有沒有內置或更有效的方法?

+0

如果所有的線條都是一樣的長度,你可以用'seek',如果不是我想的內存明智倒不如循環21000倍'的ReadLine()'和傳球然後加載所有行內存與'readlines'(在你提到的第二個選項) –

+0

@UShaShalit不,他們很不幸,每行的長度不一樣... :(它大約是每個文件1.5-3 MB。到目前爲止,我花了250ms時間來打開和讀取一個文件,問題是,我有這樣的數千個文件,我想知道是否有更高效的方法 – Ian

回答

1

您還可以使用writelines()將從0到20999行的切片列表轉儲到一個文件中,將另一個切片列表從21000轉儲到另一個文件中。

with open("inputfile") as f: 
     content = f.readlines() 
     content1 = content[:21000] 
     content2 = content[21000:] 
     with open("outputfile1.txt", "w") as fn1: 
      fn1.writelines(content1) 

     with open('outputfile2.txt','w') as fn2: 
      fn2.writelines(content2) 
+0

感謝您的迴應。當然是另一種選擇。Upvoted。 – Ian

相關問題