可以使用latin-1编码写入stdout但不能写入文件(Python 2.6)

时间:2012-11-15 15:25:38

标签: python utf-8 latin1

我有unicode数据并希望将其写入文件。我正在使用python 2.6。我能够打印编码的值但无法将其写入文件。环境的默认编码是UTF-8。尝试使用编解码器,但也没有运气。这是我正在使用的示例代码段。

#!/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')

输出:

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编码而不是Latin-1编写的。如何更改它并覆盖文件的默认编码。

编辑:2

此外,使用csv编写器进行编写会产生UnicodeEncodeError:'ascii'编解码器无法编码位置1中的字符u'\ xe9':序数不在范围内(128)

以下代码:

#!/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 个答案:

答案 0 :(得分:3)

我认为你从错误的角度攻击这个问题。在编写之前尝试编码每一行:

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编码文件:

$ 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