繁体   English   中英

UnicodeEncodeError:“ ascii”编解码器无法对不在范围内的字符进行编码(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM