2015-10-19 50 views
1

我在Windows 7中使用Python 2.7。我有一個大文本文件,我想要分成幾個較小的文件。該文件的格式目前看起來像這樣。 。 。使用雙回車將大文本文件分解成單獨的文件返回

Double carriage return 
Header line 
Body (consisting of several lines) 
Double carriage return 
Header line 
Body (consisting of several lines) 

我想創建單獨的文本文件使用標題行作爲文件名和身體作爲文件內容。 Double回車標識一個新文件的開始。

我已經搜索堆棧溢出,但還沒有找到我在找什麼。我對Python很陌生,所以任何幫助都會很感激。

我到目前爲止的代碼是。 。 。

fh = open(path/file.txt) 
data = fh.read() 
doc = re.split(r'[\r\n\r\n]',data) 
for para in doc: 
    header = re.search('^[1-9].+Chapter', para) 
    filename = str(header) + ".txt" 
    fwrite = open(filename,"w") 
    fwrite.write(para) 
    fwrite.close() 

我想使用第一行作爲文本文件標題。

+0

哪部分是你在掙扎?告訴我們你在哪裏。 – ergonaut

+0

當我使用此代碼時,我得到一個IOError:無效模式('w')或文件名 –

+0

在那裏添加您的代碼。 – ergonaut

回答

1

第一行不能正確打開文件,這應該工作,假設其他所有內容都存在。最好的做法,以保持在try Exception

fh = open('path/file.txt','r') 
data = fh.read() 
doc = re.split(r'[\r\n\r\n]',data) 
for para in doc: 
    header = re.search('^[1-9].+Chapter', para) 
    filename = str(header) + ".txt" 
    fwrite = open(filename,"w") 
    fwrite.write(para) 
    fwrite.close() 
1

open的參數是一個帶引號的字符串的文件打開;你省略了引號。

您的代碼將不必要地將整個文件拖入內存 - 這顯然不是小文件的問題,但不必要地限制您的程序。如果不需要一起分析線條,最好一次讀入一條記憶,然後再寫出一條記錄,然後將其忘掉。

您的代碼硬編碼DOS回車,這不僅是雞肋...

您的代碼並不強制分離後的第一行必須包含章節標題的要求。如果這不是一個困難的要求,替換代碼將需要一些改變。我認爲,更好地提醒和放棄,而不是從文件中進一步拉下來的東西,只是碰巧匹配;但是對於重構的代碼,後一種方法實際上並不可行。

with open('path/file', 'Ur') as input: 
    output = None 
    for line in input: 
     if output is None: 
      if 'Chapter' in line and line[0:1].isdigit(): 
       output = open('.'.join(line.rstrip(), 'txt'), 'w') 
      else: 
       raise ValueError(
        'First line in paragraph is not chapter header: ' 
        '{}'.format(line.rstrip()) 
     elif line == '\n': 
      output.close() 
      output = None 
      continue 
     output.write(line)