如何在没有 .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 不会在替换中替换,所以不要不要因为换行符是替换的一部分而担心无限替换。
我在 .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 不会在替换中替换,所以不要不要因为换行符是替换的一部分而担心无限替换。