2015-09-05 119 views
3

我正在使用Python 3.4编写一个unicode字符串到文件。 写完文件后,如果我打开并查看,它完全是一组不同的字符。python unicode:写入文件时,以不同的格式写入

CODE: -

# -*- 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) 

OUTPUT: -

أبيض 

在此先感谢

回答

4

你需要指定的编解码器时阅读以及使用方法:

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

否则使用您的系统默认值;看到open() function documentation

编码是用于解码或编码所述文件的编码的名称。这只能用于文本模式。默认编码依赖于平台(无论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) 
+0

效果很好,谢谢,谢谢你的什么是实际发生的好的解释.. –

+0

@remisharoon:什么马亭说一下以防万一你没有完全得到在你的代码中使用'name.encode(“utf-8”)'这个调用_doesn't_ modify'name':它创建一个包含'name'的utf-8编码版本的新的字节串对象,但是你不会把'name.encode(“utf-8”)'赋值给任何刚刚被删除的新字符串。 –