我知道在堆栈溢出上已经有数百个Python问题。我读过很多,但我找不到答案.
我在试着读拉丁文-1的CSV文件。它包括一个英国磅号(拉丁文中的字符\xa3 3),所以我设置了encoding="latin-1"
--但是Python似乎忽略了编码。这是:
with open(filename, newline='', encoding="latin-1") as csvfile:
data = csv.reader(csvfile, delimiter=',', quotechar='\"')
for row in data:
print(row)
生产:
UnicodeEncodeError:'ascii‘编解码器不能将字符’\xa3 3‘编码在第202号位置:序数不在范围内(128个)
我已经将原来的CSV文件减少到了触发问题的一行。是国标造成的。
我找到的唯一解决方案是使用errors="ignore"
--它只是隐藏问题,或者errors="surrogateescape"
--它只是在行后用转义字符创建一个问题。
我知道文件编码是拉丁文1,虽然我也尝试过utf-8和iso-8859-1。
Python可以很高兴地打印一个£标记:
>>> print('£')
> £
>>> print(u'\xa3')
£
欢迎任何答复/建议/建议。提前谢谢。
===更新===
这不会产生错误:
with open(file, newline='', encoding="latin-1") as csvfile:
data = csv.reader(csvfile, delimiter=',', quotechar='\"')
for row in data:
print("do nothing with the data")
发布于 2018-11-07 12:49:06
当我发布这个问题时,答案与我所期望的相差很远。这与Python无关。是编辑,
我正在Mac上运行来自崇高文本3编辑器的代码。结果是,当您这样做时,除非您显式地传递它,否则解释器不会得到任何区域设置信息。
我现在发现我的问题重复了这个问题:
Printing UTF8 in Python 3 using Sublime Text
上面的评论和回答帮助我找到了另一个问题并得到了答案。所以:
如果阿拉斯泰尔、McCormack或莱戈西亚想贴出以上的答案,我很乐意接受,以感谢你的帮助。如果你不这样做,我会接受我自己的答案,让别人看到它。
或者,如果有人阅读这篇文章想把我的问题标记为我上面链接的问题的副本,那么请继续。谢谢你们所有人。
发布于 2018-11-07 10:48:08
我能够通过将区域设置为C
来重现问题,这意味着字符集仅限于ASCII:
$ LC_CTYPE=C python3 foo.py
Traceback (most recent call last):
File "foo.py", line 7, in <module>
print(row)
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 7: ordinal not in range(128)
第7行是print
调用的行,所以这个问题出现在输出上,而不是在输入上。
在UTF-8环境下,它可以工作:
$ LC_CTYPE=en_GB.UTF-8 python3 foo.py
['1', '£']
['2', 'a']
可以使用locale
命令检查默认区域设置:
$ locale
LANG=en_GB.UTF-8
LANGUAGE=en_GB:en
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=
https://stackoverflow.com/questions/53187735
复制相似问题