对于下面相同的代码:
import os
filename = "text.txt"
data = [
[
u"hello world1",
u"hello world2",
u"hello world3",
],
[
u"hello world1",
u"hello world2",
u"hello world3",
],
]
# remove file if exist
if os.path.isfile(filename): os.remove(filename)
with open(filename, "ab+") as f:
for item in data:
f.writelines(item)
f.write("\n")
在Windows上,text.txt给出:
在Linux上:
能否解释一下为什么以及如何获得与Windows上的Linux相似的结果?
1条答案
按热度按时间f4t66c6m1#
使用
file.writelines()
时,应显式指定编码。您可以使用
with open(filename, 'w', encoding='utf-8') as f:
而不是使用with open(filename, "ab+") as f:
说明:
在Windows上,文件I/O的默认编码通常是
cp1252
,它是ASCII
的超集,其中包括许多西欧语言中使用的常用字符。这意味着如果您使用file.writelines()
将Unicode字符串写入Windows上的文件,则它们将在写入文件之前自动编码为cp1252
。在Linux上,文件I/O的默认编码通常是
UTF-8
,这是一种可变长度编码,可以表示任何Unicode字符。如果您使用file.writelines()
将Unicode字符串写入Linux上的文件,则它们将在写入文件之前被编码为UTF-8
。