【问题标题】:Parsing a book into chapters – Python将一本书解析成章节——Python
【发布时间】:2023-03-13 12:24:01
【问题描述】:

我有一本存储在单个纯文本文件中的大书,我想解析它以便为每一章创建单独的文件。我有一些简单的正则表达式可以找到每一章的标题,但我很难捕捉到它们之间的所有文本。

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

虽然我尝试将其实际写出来但不太成功。感谢您的帮助!

编辑: 具体来说,我对文件 I/O 的 Python 语法感到困惑。我试过了:

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

作为我的一般方法,但这不会像写的那样工作。希望帮助构建循环。谢谢

【问题讨论】:

  • 问题到底是什么?看起来你的方向是对的。
  • 基本上我正在寻求语法方面的帮助。该结构对我来说很有意义,但我在文件 I/O 上苦苦挣扎
  • @gweintraub 嗯...你怎么知道这行是不是一章?
  • 你能从输入文件中发布一些文本吗?
  • @KevinGuan 我的正则表达式找到章节标题。它们全部采用大写格式,并且单独排成一行。这部分代码确实有效。

标签: python regex parsing text-analysis


【解决方案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 列表为空。

【讨论】:

  • @gweintraub 我刚刚添加了一些解释。也许你想看看他们:)
  • 我收到了AttributeError: 'bool' object has no attribute 'write' ,我认为这是有道理的..这是一个错误吗? (当然是最后一行引起的错误..)
【解决方案2】:

也许您还可以尝试以下方法:

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')。

编辑:假设您有固定的章节标题模式。

【讨论】:

    【解决方案3】:

    您寻求语法方面的帮助。

    python的完整语法在这里https://docs.python.org/2/reference/grammar.html?highlight=grammar

    在@https://docs.python.org/2/reference/compound_stmts.html#the-if-statement 处查看更多冗长的 Python 文档以阅读复合语句(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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多