【问题标题】:Load a text file paragraph into a string without libraries将文本文件段落加载到没有库的字符串中
【发布时间】:2021-04-30 08:55:36
【问题描述】:

对不起,如果这个问题对你们中的某些人来说可能看起来有点愚蠢,但我完全是 Python 编程的初学者,所以我很糟糕,还有很多东西要学。 所以基本上我有这个由段落分隔的长文本文件,有时换行符可以是双倍或三倍以使我们的任务更加困难所以我添加了一点检查,看起来它工作正常所以我有一个名为“段落”的变量告诉我我目前在哪一段。 现在基本上我需要扫描这个文本文件并在其中搜索一些单词序列,但换行符是这里最大的敌人,例如,如果我有 string = "dummy text" 并且我正在调查这个:

"random questions about files with a dummy
 text and strings

 hey look a new paragraph here"

正如您所见,虚拟和文本之间有一个换行符,因此逐行读取文件不起作用。所以我想将整个段落直接加载到一个字符串中,这样我什至可以更轻松地删除标点符号和内容,并直接检查这些单词序列是否包含在其中。 所有这些都必须在没有库的情况下完成。 然而,我的一段代码段计数器在文件被读取时工作,所以如果可以上传一个字符串中的整个段落,我基本上应该使用类似 "".join 的东西,直到段落增加 1,因为我们在下一个段落?有什么想法吗?

【问题讨论】:

  • 你的变量paragraph是什么?你的“随机......这里”是一个段落吗?
  • @GyuHyeonChoi 我没有在此处发布代码,但变量段落只是一个整数,每次在 1 个或多个新空格后发现更多单词时都会增加。例如在这种情况下从“随机”到“字符串”是第 1 段,然后从“嘿”到“这里”是第 2 段
  • 超过 1 个换行符分隔段落?而你想要做的是在段落中找到单词序列?
  • @GyuHyeonChoi 有时换行可能会超过 2 个,以使整个事情变得更复杂(这是一个大学项目)。基本上是的,我需要找出那些单词序列是否正好在那个段落中(显然,如果“dummy”和“text”不相邻,则输出应该是假的)
  • 遇到空行我觉得可以join

标签: python string file txt


【解决方案1】:

这应该可以解决问题。它非常简短优雅:

with open('dummy text.txt') as file:
    data = file.read().replace('\n', '')
print(data)#prints out the file

输出是:

"random questions about files with a dummy text and strings hey look a new paragraph here"

【讨论】:

  • 这替换了 \n 并且在检查期间的 \n 问题得到了解决,但我仍然需要跟踪段落计数器,它是返回值的一部分,知道吗?
  • 我不明白你的代码是如何工作的。如果可能的话,您能否分享您编写的用于输出 para 的代码。也许那时我可以找到一种方法来连接它们。谢谢,
【解决方案2】:

我认为您不需要以困难的方式思考它。这是解决这类问题的一个非常常用的模式。

paragraphs = []
lines = []
for line in open('text.txt'):
    if not line.strip():  # empty line
        if lines:
            paragraphs.append("".join(lines))
            lines = []
    else:
        lines.append(line)
if lines:
    paragraphs.append("".join(lines))

如果stripped 行是空的,你会遇到第二个\n,这意味着你必须join 前一行到一个段落。

如果你遇到第三个\n,你不能再join,所以删除你之前的行(lines = [])。这样你就不会再join同一个段落了。

要检查最后一行,试试这个模式。

f = open('text.txt')
line0 = f.readline()
while True:
    # do what you have to do with the previous line, `line0`
    line = f.readline()
    if not line:    # `line0` was the last line
        # do what you have to do with the last line
        break
    line0 = line  

【讨论】:

  • 进行了一些更改,但保留了这个概念,我将它集成到我的程序中,但只有一个问题:当我到达文件末尾(最后一段)时,因为没有换行符,它只是忽略 .那时加入,有什么方法可以了解我是否在文件的最后一行?我打开它是这样的:for index, line in enumerate(file.readlines()):
  • 在我的代码 sn-p. for 循环之外的最后一个 if 是到最后一段 joinreadlines() 返回的列表的最后一个元素是最后一行。在最后一行readline() 之后返回None
  • 是的,但是我必须进行一些更改才能将其集成到我的程序中,并且无法完成最后一部分,只是在此之前执行了另一段代码来读取文件并保存它的最后一行并在段落中添加了一个“if”检查以防万一 line == last_line 只执行 .join,在我完成整个工作后,我将开始优化过程
  • @Krist 我为您的要求添加了另一种模式。如果有效,请检查并接受它! :)
  • 完美运行!由于这个练习的复杂性,仍然卡住了,但我希望找到解决方法,我低估了“顺序单词”部分,而文件中单独出现的单词在我的输出中......也许明天会要求更多帮助,因为这让我发疯,已经超过 1 周了
【解决方案3】:

您可以去掉换行符。这是来自不同问题的示例。

data = open('resources.txt', 'r')
book_list = []
for line in data:
    new_line = line.rstrip('\n')
    book_list.append(new_line)

【讨论】:

  • 是的,.rstrip 是我绝对要做的事情,我只需要弄清楚如何将 1 段的所有行合并到一个字符串中,并且在我完成所有需要的操作之后将另一段加载到字符串中,依此类推,直到文件完成
  • @Krist 假设您有一个名为 my_string 的字符串,它可能为空,也可能不为空。您只需在 for 循环中添加 my_string += new_line 即可构建您的字符串。
猜你喜欢
  • 2015-04-05
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多