Python 3.x Python 3在内置升华文本时似乎忽略了CSV文件的编码设置

Python 3.x Python 3在内置升华文本时似乎忽略了CSV文件的编码设置,python-3.x,csv,unicode,sublimetext3,Python 3.x,Csv,Unicode,Sublimetext3,我知道已经有数百个关于堆栈溢出的Python Unicode问题。我读了很多,但我找不到我的答案 我正在尝试读取一个拉丁-1 CSV文件。它包含一个英国镑符号(拉丁语-1中的字符\xa3),因此我设置了encoding=“latin-1”——但Python似乎忽略了编码。这: with open(filename, newline='', encoding="latin-1") as csvfile: data = csv.reader(csvfile, delimiter=',', q

我知道已经有数百个关于堆栈溢出的Python Unicode问题。我读了很多,但我找不到我的答案

我正在尝试读取一个拉丁-1 CSV文件。它包含一个英国镑符号(拉丁语-1中的字符\xa3),因此我设置了
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”编解码器无法对位置202处的字符“\xa3”进行编码:序号不在范围内(128)

我已将原始CSV文件缩减为引发问题的单行。是这个符号引起的

我找到的唯一解决方案是使用
errors=“ignore”
——这只是隐藏了问题,或者
errors=“subrogateScape”
——这只是在进一步使用转义字符时产生了问题

我知道文件编码是拉丁语-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")

通过将区域设置设置为
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)
您可以使用
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=

答案与我发布问题时的预期相差甚远。这与Python无关。是编辑。

我在Mac上运行升华文本3编辑器的代码。事实证明,当您这样做时,除非您显式地传递语言环境信息,否则解释器不会获得任何语言环境信息

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

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

如果Alastair McCormack或Legossia愿意将上述内容作为答案发布,那么我很乐意接受,以感谢您的帮助。如果你不这样做,那么我会接受我自己的答案,让其他人看到


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

您能为stacktrace提供错误信息吗?我想问题不在于读取,而是当您将行打印到屏幕上时。我想您是对的。。。见上面的更新。我想我以前也试过,结果是一样的,但现在做并没有问题。所以也许我以后有一个完全不同的问题要问!有没有一个快速的答案可以在这里分享?如果需要新问题,我可以稍后再发。谢谢。是的,错误在堆栈跟踪的打印(行)中。谢谢。很奇怪,你的互动控制台工作正常。如何调用包含CSV读取的脚本?
$ 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=