![](/img/trans.png)
[英]Python mmh3: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-14: ordinal not in range(128)
[英]UnicodeEncodeError: 'ascii' codec can't encode characters ordinal not in range(128)
我无法从文本文件中读取Curaçao一词。 我究竟做错了什么?
我写了一个包含单词“Curaçao”的文本文件。 编辑器(vim)上的编码为latin1。
这个python程序读取文件:
import sys
with open ('foo.txt', 'r', encoding='latin1') as f:
print('f:', f.encoding)
print('stdout:', sys.stdout.encoding)
for i in f:
print(i)
当我运行它时,我得到了...
sundev19:/home/jgalloway12/code/wdPhone $ python3 CountryFix.py
f: latin1
stdout: 646
Traceback (most recent call last):
File "CountryFix.py", line 11, in <module>
print(i)
UnicodeEncodeError: 'ascii' codec can't encode character '\xe7' in position 4: ordinal not in range(128)
这是二进制文件的内容。
0000000: 4375 7261 e761 6f0a Cura.ao.
编辑:我要在这里解决的“实际”问题是阅读包含国家名称的Excel 2010导出的CSV。
修复了要以Latin1编码的文件。 程序现在将打印区域设置。
这里的问题不是文件,而是输出流。
无论出于何种原因,当您真的想要更多东西(utf-8,latin1等)时,python都会将您的标准输出编码检测为US-ASCII。
您的选择是:
欺骗它,使其相信一种不同的编码(在Linux上,您可以使用LANG=en_US.UTF-8
,但是我假设您在Windows上,并且我不记得如何以这种方式在Windows上欺骗python了:))。
将您的回复写入文件:
with open('output.txt', 'w', encoding='latin1') as f:
...
或写入标准输出字节流:
import sys
sys.stdout.buffer.write(i.encode('latin1'))
由于您正在打印行,而python print
函数不使用open()
函数的编码,因此它会尝试使用默认编码ASCII来对字符串进行编码。 因此,当您要打印unicode时,需要为其定义服装编码。
您可以将str.encode()
方法与正确的编码一起使用以进行打印。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.