python - 如何在没有 .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 而不是字符串。
解决方案
您的文件已经包含换行符('\x0a'
是产生的完全相同字符的转义'\n'
)。我假设您的渲染器正在发送 HTML,并且 HTML 不关心文本中的换行符(在pre
块之外,以及其他类似样式的块)。
因此,要么将数据包装在一个pre
块中,要么'\n'
用<br>
标签替换(这就是 HTML 所说的“不,真的,我想要换行符”),例如:
from_text = from_text.replace("\n", "<br>\n")
留下换行符对查看源代码的人来说可能很方便,所以我用<br>
标签和换行符替换(Python不会替换替换,所以不要担心无限替换只是因为换行符是替换的一部分)。
推荐阅读
- ios - iOS BLE 附件想在未查看应用时打开应用。如何使此警报静音?
- java - 如何使用 Apache Batik 库在 SVGGraphics2D 中转换 Graphics2D?
- linux - 卸载高分辨率定时器模块
- php - 如何使用 else 创建 SQL 和 PHP IF 语句
- c# - XML 矩形选项
- android - 如何计算天数以在android中获取结束日期?
- python - 即使我迭代地改变初始猜测,scipy curve_fit 也不会收敛
- php - Laravel:搜索结果分页,下一页不显示搜索关键字的下一页结果
- sparql - Wikidata 中的高效过滤器查询
- ios - 多层动画,如何只暂停其中一个