首页 > 解决方案 > 如何在没有 .readlines() 的情况下读取 .txt 文件/用 \n 替换 UTF-8 换行符?

问题描述

我在一个 .txt 文件中有一些 AI 生成的废话,如下所示:

MENENIUS:
I have been they prayers of the reason,
And away to friends than the state pointer;
The words that shall can virtue to your head.

我有一些 Python 代码(使用web.py),如下所示:

class index(object):
    def GET(self):
        text = open("menenius.txt", "r").read() 
        return render.index(text)

当我在 localhost 中查看它时,它看起来像这样:

MENENIUS: I have been they prayers of the reason, And away to friends than the state pointer; The words that shall can virtue to your head.

Menenius 的小演讲实际上只是一个更大的 .txt 文件的剪辑,所以我不想使用.readlines(),因为遍历列表会占用大量内存。如果这不是问题,在普通脚本中,我可以只打印.readlines()生成的列表,但我正在使用 web.py 并且需要将其变为render.index()复杂的事实。

我试过的

我的第一个想法是使用.replace()脚本中生成 menenius.txt 的方法将不可见的 UTF-8 换行符的每个实例替换为\n. 由于.read()将整个 .txt 文件作为单个字符串提供给您,因此我认为这可行,但这样做:

from_text = open("menenius.txt", "r").read()
from_text.replace(0x0A, "\n")

得到我这个错误,指的是行.replace()

TypeError: expected a character buffer object

我用谷歌搜索过,但似乎都不是很适用或很清楚。我刚刚开始使用 Python,我已经在这个圈子里转了几个小时,所以我觉得这里有一些我不知道的非常明显的东西。


正如我提到的,我也尝试过返回.readlines()生成的列表,但这会占用大量内存,我不确定如何将输出放入其中render.index()

编辑:解决方案

所以下面的答案有效,但在我做出改变之后,我仍然遇到同样的问题。ShadowRanger 的“我假设您的渲染器正在发送 HTML”让我开始思考,我打开 localhost 并进入网络检查器,看到所有文本都在其p标签内的引​​号中,如下所示:

<p>
"MENENIUS: I have been they prayers of the reason, And away to friends than the state pointer; The words that shall can virtue to your head."
</p>

几个小时后,我意识到了一些事情,然后又回到了这个问题上。在index.html内容被发送到的文件中,它看起来像这样:

<p>
$content
</p>

我有一个怀疑,再次检查了web.py 介绍教程,发现了这个:

如您所见,模板看起来很像 Python 文件,除了顶部的 def with 语句(说明调用模板的内容)和放在任何代码前面的 $s。目前,template.py 要求 $def 语句是文件的第一行。另外,请注意 web.py 会自动转义此处使用的任何变量,因此如果出于某种原因将 name 设置为包含某些 HTML 的值,它将被正确转义并显示为纯文本。如果你想关闭它,写 $:name 而不是 $name。

我改为$content$:content突然文本被呈现为 HTML 而不是字符串。

标签: pythonweb.py

解决方案


您的文件已经包含换行符('\x0a'是产生的完全相同字符的转义'\n')。我假设您的渲染器正在发送 HTML,并且 HTML 不关心文本中的换行符(在pre块之外,以及其他类似样式的块)。

因此,要么将数据包装在一个pre块中,要么'\n'<br>标签替换(这就是 HTML 所说的“不,真的,我想要换行符”),例如:

from_text = from_text.replace("\n", "<br>\n")

留下换行符对查看源代码的人来说可能很方便,所以我用<br>标签和换行符替换(Python不会替换替换,所以不要担心无限替换只是因为换行符是替换的一部分)。


推荐阅读