2015-10-19 13 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")