我无法从文本文件中读到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中编码的文件。程序现在打印区域设置。
答案 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()
方法进行适当的编码以进行打印。