您还需要指定在阅读时使用的编解码器:
f = open('test.txt','r', encoding='utf8')
for line in f.readlines():
print(line)
否则使用您的系统默认值;请参阅open()
功能文档:
encoding是用于对文件进行解码或编码的编码名称。这应该只在文本模式下使用。默认编码取决于平台(无论locale.getpreferredencoding()
返回什么),但可以使用 Python 支持的任何编码。
从您得到的输出来看,您的系统默认使用Windows 代码页 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)