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

How to read .txt file without .readlines() / replace UTF-8 newline character with \n?

我在 .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() 使事情复杂化。

我试过的

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

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

给我这个错误,指的是带有 .replace():

的行
TypeError: expected a character buffer object

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


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

编辑:解决方案

所以下面的答案有效,但在我进行更改后,我仍然遇到同样的问题。 ShadowRanger 的 "I'm assuming your renderer is sending out HTML" 让我开始思考,我打开本地主机并进入网络检查器,看到所有文本都在其 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 intro tutorial,发现了这个:

As you can see, the templates look a lot like Python files except for the def with statement at the top (saying what the template gets called with) and the $s placed in front of any code. Currently, template.py requires the $def statement to be the first line of the file. Also, note that web.py automatically escapes any variables used here, so that if for some reason name is set to a value containing some HTML, it will get properly escaped and appear as plain text. If you want to turn this off, write $:name instead of $name.

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

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

因此要么将数据包装在 pre 块中,要么将 '\n' 替换为 <br> 标记(HTML 表示 "No, really, I want a line break") , 例如:

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

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