Python Unicode:写入文件时,会以不同的格式写入。

3

我将使用Python 3.4来将Unicode字符串写入文件。

文件写入后,如果我打开并查看,会发现完全是一组不同的字符。

代码:

# -*- coding: utf-8 -*-

with open('test.txt', 'w', encoding='utf-8') as f:
    name = 'أبيض'
    name.encode("utf-8")
    f.write(name)
    f.close()    

f = open('test.txt','r')
for line in f.readlines():
    print(line) 

输出:

أبيض

Thanks in advance

1个回答

4

在读取时,您需要指定要使用的编解码器:

f = open('test.txt','r', encoding='utf8')
for line in f.readlines():
    print(line) 

否则将使用系统默认设置;请参见open()函数文档

encoding是用于解码或编码文件的编码名称。这仅适用于文本模式。默认编码取决于平台(即locale.getpreferredencoding()返回的值),但可以使用Python支持的任何编码。

根据您得到的输出,您的系统使用Windows Codepage 1252作为默认设置:
>>> 'أبيض'.encode('utf8').decode('cp1252')
'أبيض'

当您在阅读时使用错误的编解码器,会创建所谓的 Mojibake

请注意,在您的写作示例中,name.encode('utf8') 行是完全多余的;该调用的返回值被忽略了,而是 f.write(name) 调用处理实际的编码。 f.close() 调用也是完全多余的,因为 with 语句已经负责关闭您的文件。以下代码将产生正确的输出:

with open('test.txt', 'w', encoding='utf-8') as f:
    name = 'أبيض'
    f.write(name)

with open('test.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        print(line) 

工作得很好,谢谢,也感谢您对实际发生情况的精彩解释。 - Remis Haroon - رامز
@remisharoon:如果你没有完全理解Martijn在你的代码中关于name.encode("utf-8")这一行所说的话……那个调用并不会修改name:它创建了一个新的字节字符串对象,其中包含name的utf-8编码版本,但由于你没有将name.encode("utf-8")分配给任何变量,所以那个新字符串就被丢弃了。 - PM 2Ring

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