2011-01-13 152 views
0

Regards,SO使用文本分隔符將25mb .txt文件分割成更小的文件

我是python和Perl的新手。我一直在試圖解決一個簡單的問題,並與句法結合在一起。我希望有人有時間和耐心來幫忙。 我有一個「.txt」格式的25mb文件,其中包含回溯到1970年的新聞文章。每個新聞故事連接到下一個,只有「版權」聲明進行分隔。每個新聞報道都以「XXX文件XX項目」開頭。有些元數據在整個過程中都會重複使用,我會在稍後使用這些元數據進行標記。

我想這個25MB的文件拆分成單獨的.txt文件,每個包含一個新聞故事(即「文檔」和「版權」,節約每一個不同的名稱(顯然)之間的文本。

我我試圖1)打開文件... 2)遍歷文件中的行檢查eof分隔符,如果它不存在將行寫入列表3)將該列表寫入單獨的小文件。

我在使用計數器更改文件名時遇到了很大的問題,我該如何讓Python從我離開的位置開始,「seek」功能是否合適?

到目前爲止,我一直在嘗試這種做法,完全失敗:

myfile = open ("myfile.txt", 'r') 
filenumber = 0 
for line in myfile.readline(): 
    filenumber += 1  
    w=0 
    while myfile.readline() != '\s+DOCUMENTS\s*\n' 
    ### read my line into a list 
    mysmallfile()['w'] = [myfile.readline()] 
    w += 1 
    output = open('C:\\Users\\dunner7\\Documents\###how do I change the filename  each  iteration???', 'w') 
    output.writelines(mysmallfile) 
    ###go back to start. 

感謝您的時間和耐心。

RD

這裏是文本文件的樣本:

      1 of 575 DOCUMENTS 

         The Washington Daybook 

          January 28, 2011 

衛生和人類服務部(HHS);食品和藥物管理局(FDA) (FR第72832頁)召開了醫療器械諮詢委員會的神經器械專家組會議,討論並提出有關 的建議,指出用於1月27日治療的電休克治療 的器械可能會重新分類-28。

時間:上午8

位置:希爾頓華盛頓特區北部/蓋士堡,宴會廳,620佩裏景觀道路, 馬里蘭州蓋瑟斯堡

聯繫人:詹姆斯·恩格斯,800-741-8138 [注:使用代碼:3014512513,當 要求信息]

負載日期:2010年11月28日,

語言:英文版

TYPE:會議

 Copyright 2011 Federal Information and News Dispatch, Inc. 


          2 of 575 DOCUMENTS 

         The Washington Daybook 

          January 27, 2011 

衛生和人類服務部(HHS);食品和藥物管理局(FDA) (FR第72832頁)召開了醫療器械諮詢委員會的神經器械專家組會議,討論並提出有關 的建議,指出用於1月27日治療的電休克治療 的器械可能會重新分類-28。

時間:上午8

位置:希爾頓華盛頓特區北部/蓋士堡,宴會廳,620佩裏景觀道路, 馬里蘭州蓋瑟斯堡

聯繫人:詹姆斯·恩格斯,800-741-8138 [注:使用代碼:3014512513,當 要求信息]

負載日期:2010年11月28日,

語言:英文版

TYPE:會議

 Copyright 2011 Federal Information and News Dispatch, Inc. 


          3 of 575 DOCUMENTS 


           FNS DAYBOOK 

         January 12, 2011 Wednesday 
           FUTURE EVENTS 

事件:會議 - 衛生與公衆服務部(HHS);食品和藥物管理局(FDA)(F.R.第72832頁); 位置:希爾頓華盛頓特區北部/蓋士堡,宴會廳,620佩裏景觀道路, 馬里蘭州蓋瑟斯堡 - 2011年1月27日,上午8:00

部分:聯邦機構和部門 - 期貨

長度:72單詞

對象:健康和人類服務部(HHS);食品和藥物管理局(FDA)(FR第72832頁)召開了醫療器械諮詢委員會器械小組會議,討論並提出 關於在1月27日用於電休克治療的 指示可能重新分類器械的建議-28。

聯繫人:詹姆斯·恩格斯,800-741-8138 [注:使用代碼:當 要求信息3014512513,]

負載日期:2011年1月10日

語言:英文版

出版物-TYPE:事件調度

    Copyright 2011 Federal News Service 
          All Rights Reserved 
+2

你能提供一個文件的片段嗎? – nosklo 2011-01-13 11:48:35

回答

1

類似的東西:

filenumber = 0 
outfile = None 
with open('source_file.txt') as f: 
    for line in f: 
     if line.strip() == 'DOCUMENTS': 
      filenumber += 1 
      outfile = open('result%03d.txt' % filenumber, 'w') 
     elif line.strip().startswith('Copyright') and outfile: 
      outfile.close() 
      outfile = None 
     elif outfile: 
      outfile.write(line) 
if outfile: 
    outfile.close() 

我不得不猜測很多東西,因爲我不知道文件的外觀如何。如果您還有其他問題,請發佈文件。

+0

你們都是美麗的人。感謝您的嘗試。我通常不會在尋找答案後發表意見,而我在Python書籍中深深陷入困境,但我只需要一段時間。再次感謝您的嘗試。這不是很有效(但它也沒有錯誤)。文件看起來像這樣: – rosser 2011-01-13 15:25:24

+0

@ user574141:只需提供一小段文件,然後 – nosklo 2011-01-13 15:28:15

1

沿途的幾個問題:

  • 寫一個小文件,當你在兩個循環迭代使用myfile.readline() - 只需使用line當你想知道當前的內容行
  • myfile.readline() != 'string'位總是會失敗,這實際上不是一個正則表達式匹配。
  • mysmallfile()['w']看起來過於聰明(如果您使用mysmallfile()函數返回索引爲'w'的數組或字典以檢索L值(!))或者像你剛剛離開這裏的路:)
  • 你打開一個文件,寫入一行,但從未關閉該文件。當你用完打開的文件描述符時,這是1000行後失敗的祕訣。

有很多清理納入了nosklo的建議,我希望我的文章可以幫助您瞭解他是如何得到他的。 :)