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

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