Can write to stdout using latin-1 encoding but not to a file (Python 2.6)
我有Unicode格式的数据,希望将其写入文件。我使用的是python 2.6。我可以打印编码的值,但不能将其写入文件。环境的默认编码是utf-8。也尝试使用编解码器,但也没有运气。下面是我正在使用的示例代码片段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/usr/bin/python import sys import codecs import csv sh = [u'T\xe9l\xe9vista S.A.', u'T\xe9l\xe9vista S.A.', 'Python'] print sys.stdout.encoding f = codecs.open('listwrite.txt', 'w', encoding='latin-1') for item in sh: f.write(item) f.close() for i in sh: print i.encode('latin-1') |
γ
输出:
1 2 3 4 5 6 7 | UTF-8 Télévista S.A. Télévista S.A. Python Contents of listwrite.txt T??l??vista S.A.T??l??vista S.A.Python |
γ
如上所示,文件是用UTF-8编码而不是拉丁语-1编写的。如何更改它并重写文件的默认编码。
编辑:2
此外,使用csv编写器进行写入会产生unicodeencodeerror:'ascii'编解码器无法对位置1中的字符u'xe9'进行编码:序号不在范围内(128)
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/usr/bin/python import sys import codecs import csv sh = [u'T\xe9l\xe9vista S.A.', u'T\xe9l\xe9vista S.A.', 'Python'] print sys.stdout.encoding c = csv.writer(codecs.open('listwrite.txt', 'w', encoding='latin-1'), quoting=csv.QUOTE_NONE) c.writerow(sh) f.close() for i in sh: print i.encode('latin-1') |
我认为你是从一个错误的角度来解决这个问题。在写入之前尝试对每行进行编码:
1 2 3 4 5 6 7 | import csv sh = [u'T\xe9l\xe9vista S.A.', u'T\xe9l\xe9vista S.A.', 'Python'] f = open('listwrite.txt', 'wb') # binary mode writer = csv.writer(f) writer.writerow([item.encode('latin-1') for item in sh]) f.close() |
现在您有了一个正确的Latin1编码文件:
1 2 3 4 | $ cat listwrite.txt | iconv -f latin1 Télévista S.A.,Télévista S.A.,Python $ file listwrite.txt listwrite.txt: ISO-8859 text, with CRLF line terminators |