【问题标题】:Can write to stdout using latin-1 encoding but not to a file (Python 2.6) [closed]可以使用 latin-1 编码写入标准输出,但不能写入文件(Python 2.6)[关闭]
【发布时间】:2012-11-15 15:25:38
【问题描述】:

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

#!/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' codec can't encode character u'\xe9' in position 1: ordinal not in range(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')

【问题讨论】:

  • 我无法用 Python 2.6 重现这个。对我来说,listwrite.txt 在我运行您的示例代码时包含 Latin-1 编码数据。您如何验证内容?
  • 我知道一种方法是更改​​ site.py 中的默认编码。我不想走那条路。是否有任何其他解决方法可以即时使用 latin-1 写入文件?这会很有帮助。
  • 只是在做一只猫或在 vi 中看到它!
  • 对不起,在文件上做猫有 latin-1 但使用 vi 打开有 UTF-8。我现在很困惑。
  • 尝试在终端之外查看它(任何文本编辑器等) - 根据您的设置,在终端中查看输出而不是非终端文本时,您将获得不同的结果编辑等

标签: python utf-8 latin1


【解决方案1】:

我认为您从错误的角度解决问题。在写入之前尝试对每一行进行编码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2018-12-07
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多