2015-10-19 40 views
3

我有一本大書存儲在一個純文本文件中,並且想分析它以便爲每章創建單獨的文件。我使用一些簡單的正則表達式來查找每章的標題,但我很努力地捕捉到所有的文章。將書分解成章節 - Python

import re 

txt = open('book.txt', 'r') 

for line in txt : 
    if re.match("^[A-Z]+$", line): 
     print line, 

我知道這是很不成熟,但我足夠的新的Python,它的讓我有點難倒。目前,我要去一行行,這樣我的思維過程是:

  1. 如果該行是一個章節標題:創建一個新的文件「chapter_title.txt」
  2. 如果下一行不章節標題:將該行寫入chapter_title.txt

雖然我試圖寫出來的嘗試並不成功。感謝幫助!

編輯:具體來說,我很困惑Python語法的文件I/O。我已經嘗試過:

for line in txt : 
    if re.match("^[A-Z]+$", line): 
     f = open(line + '.txt', 'w') 
    else f.write(line + "\n") 

作爲我的一般方法,但這不會像書面工作。希望幫助構建循環。由於

+1

究竟是什麼問題?看起來你在正確的方向。 – Maroun

+0

基本上我正在尋找幫助的語法。結構對我來說很有意義,但是我正在努力處理文件I/O – gweintraub

+0

@gweintraub嗯......你怎麼知道這行是否是一章? –

回答

1

我認爲這將工作:

import re 

with open('book.txt', 'r') as file: 
    txt = file.readlines() 

f = False 

for line in txt: 
    if re.match("^[A-Z]+$", line): 
     if f: f.close() 
     f = open(line + '.txt', 'w') 

    else: 
     f.write(line + "\n") 

也許我應該補充一些解釋:

  1. with會自動關閉該文件。關閉打開的文件很重要。

  2. readlines()函數可以通過行讀取文件並將輸出保存到列表中。

  3. 這裏我使用的是f = False。所以第一次if f:將是False

現在這裏是很重要的,如果文件f已經打開,然後if f:True,文件將被f.close()被關閉(但第一次f.close()將無法​​運行)。

然後,f = open(line + '.txt', 'w')將文本寫入該文件,當re.match("^[A-Z]+$", line)True文件將被關閉,並打開另一個文件,一而再,再直到txt列表爲空。

+1

它的工作原理!萬分感謝! – gweintraub

+1

@gweintraub我剛剛添加了一些解釋。也許你想看到他們:) –

+0

我得到'AttributeError:'布爾'對象沒有屬性'寫'',我認爲它是有道理的..它是一個錯誤? (由當然最後一行引起的錯誤..) – oba2311

1

或許你也可以嘗試以下方法:

import re 

with open('book.txt', 'r') as file: 
    lines = file.read() 

contents = re.split("[A-Z]+", lines) 
for i in range(1, len(contents), 2): 
    with open(contents[i] + '.txt', 'w') as file: 
     file.write(contents[i+1]) 

本書內容由章節標題分裂。然後將結果章節內容(contents[i+1])寫入章節文件(contents[i] + '.txt')。

編輯:這假設你有一個固定的章節標題模式。

-1

你問了語法的幫助。

python的完整語法在這裏https://docs.python.org/2/reference/grammar.html?highlight=grammar

查看更多羅嗦的Python文檔@https://docs.python.org/2/reference/compound_stmts.html#the-if-statement閱讀複合語句(與&如果)更準確地知道語法。

此外,請參閱https://docs.python.org/2/library/functions.html#open瞭解內置函數open()。

與代碼塊的縮進保持一致,並記住一個: 必須遵循套件之前的每個語句。

import re 

with open('book.txt', 'r') as corpus: 
    eye = corpus.readlines() 

verdad = False 
lambda l: re.match("^[A-Z]+$", l) 

for line in eye: 
    if l(line): 
     if verdad: verdad.close() 
     verdad = open(line.replace(' ','_') + '.txt', 'w') 
    elif ! l(line): 
     if verdad: verdad.close() 
    else: 
     verdad.write(line + "\n")