首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python 3在以崇高文本构建时似乎忽略了CSV文件的编码设置

Python 3在以崇高文本构建时似乎忽略了CSV文件的编码设置
EN

Stack Overflow用户
提问于 2018-11-07 10:36:04
回答 2查看 536关注 0票数 1

我知道在堆栈溢出上已经有数百个Python问题。我读过很多,但我找不到答案.

我在试着读拉丁文-1的CSV文件。它包括一个英国磅号(拉丁文中的字符\xa3 3),所以我设置了encoding="latin-1" --但是Python似乎忽略了编码。这是:

代码语言:javascript
代码运行次数:0
运行
复制
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可以很高兴地打印一个£标记:

代码语言:javascript
代码运行次数:0
运行
复制
>>> print('£')
> £
>>> print(u'\xa3')
£

欢迎任何答复/建议/建议。提前谢谢。

===更新===

这不会产生错误:

代码语言:javascript
代码运行次数:0
运行
复制
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")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-07 12:49:06

当我发布这个问题时,答案与我所期望的相差很远。这与Python无关。是编辑,

我正在Mac上运行来自崇高文本3编辑器的代码。结果是,当您这样做时,除非您显式地传递它,否则解释器不会得到任何区域设置信息。

我现在发现我的问题重复了这个问题:

Printing UTF8 in Python 3 using Sublime Text

上面的评论和回答帮助我找到了另一个问题并得到了答案。所以:

如果阿拉斯泰尔、McCormack或莱戈西亚想贴出以上的答案,我很乐意接受,以感谢你的帮助。如果你不这样做,我会接受我自己的答案,让别人看到它。

或者,如果有人阅读这篇文章想把我的问题标记为我上面链接的问题的副本,那么请继续。谢谢你们所有人。

票数 0
EN

Stack Overflow用户

发布于 2018-11-07 10:48:08

我能够通过将区域设置为C来重现问题,这意味着字符集仅限于ASCII:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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环境下,它可以工作:

代码语言:javascript
代码运行次数:0
运行
复制
$ LC_CTYPE=en_GB.UTF-8 python3 foo.py
['1', '£']
['2', 'a']

可以使用locale命令检查默认区域设置:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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=
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53187735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档