将umlauts写入文件的Python方法

3
我有以下输出,我想将其写入文件:
l  = ["Bücher", "Hefte, "Mappen"]

我是这样做的:

f = codecs.open("testfile.txt", "a", stdout_encoding)
f.write(l)
f.close()

在我的文本文件中,我希望看到的是:["书籍", "笔记本", "文件夹"]而不是B\xc3\xbccher。

有没有不需要循环列表并解码每个项目就可以这样做的方法?比如给write()函数传递任何参数吗?

非常感谢


stdout_encoding是什么意思? - ForceBru
sorry its utf-8 - Constantine
1个回答

7

首先,请确保您使用Unicode字符串:在字符串前添加“u”前缀:

l  = [u"Bücher", u"Hefte", u"Mappen"]

接下来,您可以写入或追加到文件:

我建议您使用 io 模块,该模块兼容 Python 2/3。

with io.open("testfile.txt", mode="a", encoding="UTF8") as fd:
    for line in l:
        fd.write(line + "\n")

要一次性读取文本文件:

with io.open("testfile.txt", mode="r", encoding="UTF8") as fd:
    content = fd.read()

结果内容是一个Unicode字符串。

如果您使用UTF8编码对此字符串进行解码,则会得到像这样的字节字符串:

b"B\xc3\xbccher"

使用writelines编辑

writelines()方法将一系列字符串写入文件。这个序列可以是任何可迭代的对象,产生字符串,通常是一个字符串列表。没有返回值。

# add new lines
lines = [line + "\n" for line in l]

with io.open("testfile.txt", mode="a", encoding="UTF8") as fd:
    fd.writelines(lines)

谢谢。如果我的输出包含多个列表,我需要分别对列表中的项进行编码。我没有机会在不知道哪个列表可能包含umlauts的情况下一次性完成所有输出的编码。我正在寻找一种解决方案,可以让我在文件中写入输出,而无需分别循环遍历列表和单独编码字符串。 - Constantine
不清楚你真正想做什么。只有在写入(或读取)文件时才需要编码(或解码)。因为文本文件是字节流:内部表示始终是字节数组。经典用法是使用UTF8编码。 - Laurent LAPORTE
我想将信息写入一个 .txt 文件,但是我遇到了一个问题,一些字符串在文本文件中正确显示,例如 Bücher,而其他在列表中的字符串则显示为 B\xc3\xbcr。 - Constantine
1
如果你直接将Python列表“写入”文件,Python会使用repr函数执行带有反斜杠转义的ASCII编码。你需要按照我建议的逐行写入。你也可以使用writelines,但需要添加一个分隔符,比如换行符。请参考我的编辑。 - Laurent LAPORTE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接