将一本书解析成章节 - Python

3

我有一本大书存储在一个纯文本文件中,想解析它以创建每个章节的单独文件。我使用了一些简单的正则表达式来找到每个章节标题,但是我在捕获标题之间的所有文本方面遇到了困难。

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文件输入输出语法感到困惑。我已经尝试过:
for line in txt :
    if re.match("^[A-Z]+$", line):
        f = open(line + '.txt', 'w')
    else f.write(line + "\n")

作为我的一般方法,但这样写不会起作用。希望能得到关于循环结构的帮助。谢谢。

1
你的问题是什么?看起来你走在了正确的方向上。 - Maroun
基本上我正在寻求语法方面的帮助。结构对我来说很清晰,但我在文件I/O方面遇到了困难。 - gweintraub
@gweintraub 嗯...您如何确定这一行是章节还是其他内容呢? - Remi Guan
你能发布一些输入文件中的文本吗? - Hackaholic
@KevinGuan 我的正则表达式可以找到章节标题。它们是大写格式,并且单独占据一行。这部分代码肯定有效。 - gweintraub
@hackaholic 我实际上正在使用《权力的游戏》作为我的语料库。它的格式如下:ARYA [数千字的文本] \n \n \n \n \n TYRION 等。 - gweintraub
3个回答

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 我刚刚添加了一些说明。也许你想看看 :) - Remi Guan
1
我得到了 AttributeError: 'bool' object has no attribute 'write',我认为这是有道理的.. 这是一个 bug 吗?(当然是由最后一行引起的..) - 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 了解复合语句(with、for 和 if)的语法。

此外,参见 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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接