UnicodeEncodeError:'ascii'编解码器不能编码不在范围内的字符序号(128)

时间:2015-09-28 15:28:15

标签: python python-3.4

我无法从文本文件中读到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中编码的文件。程序现在打印区域设置。

2 个答案:

答案 0 :(得分:4)

这里的问题不是文件,而是输出流。

无论出于何种原因,当您真正需要更多内容时,python已将您的stdout编码检测为US-ASCII(utf-8,latin1等)。

您的选择是:

欺骗它相信一个不同的编码(在Linux上你可以用- (IBAction)showSettingsPush:(id)sender { [self.navigationController pushViewController:[[IASKAppSettingsViewController alloc] init] animated:YES]; } 做到这一点,但我假设你在Windows上,我不记得如何在Windows上欺骗python方式:))。

将您的回复写入文件:

LANG=en_US.UTF-8

或者写入stdout字节流:

with open('output.txt', 'w', encoding='latin1') as f:
    ...

答案 1 :(得分:1)

由于您正在打印行并且python print函数不使用open()函数的编码,因此它会尝试使用ASCII的默认编码对您的字符串进行编码。因此,当您想要打印它时,需要为您的unicode定义服装编码。

您可以使用str.encode()方法进行适当的编码以进行打印。