【问题标题】:Pydev 3.8 or 3.9 requires utf-8 encoding to be manually set in Python 3 code: UnicodeDecodeErrorPydev 3.8 或 3.9 需要在 Python 3 代码中手动设置 utf-8 编码:UnicodeDecodeError
【发布时间】:2014-12-10 21:08:01
【问题描述】:

在 Python 3.4 中从 Python shell 运行这段代码就可以了:

from csv import reader

if __name__ == '__main__':
    filename = "valid.csv"

    with open(filename) as f:
        csvreader = reader(f)
        for keyword in csvreader:
            kw = keyword[0]

但是,在 Eclipse 中使用 Pydev 3.8 或 3.9 运行它会失败:

pydev debugger: starting (pid: 64416)
Traceback (most recent call last):
  File "/Applications/eclipse/plugins/org.python.pydev_3.9.0.201411111611/pysrc/pydevd.py", line 2183, in <module>
    globals = debugger.run(setup['file'], None, None)
  File "/Applications/eclipse/plugins/org.python.pydev_3.9.0.201411111611/pysrc/pydevd.py", line 1622, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Applications/eclipse/plugins/org.python.pydev_3.9.0.201411111611/pysrc/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc) 
  File "/Users/antoinebrunel/src/test_pydev/test_pydev/test_pydev.py", line 14, in <module>
    for keyword in csvreader:
  File "/Users/antoinebrunel/.virtualenvs/seo3/lib/python3.4/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)

为了让代码运行,替换:

with open(filename, mode='rt') as f:

与:

with open(filename, mode='rt', encoding='utf-8') as f:

注意 1:文件 valid.csv 包含任何带重音的字符,例如:

à

注2:在Eclipse 首选项> 工作区中,文本文件编码设置为utf-8

参考 This StackOverflow question 可能相关

【问题讨论】:

  • 你是说你已经解决了这个问题吗?如果是这样,请将答案部分放在下面的答案帖子中。还是这里还有一个实际问题?
  • 这还是个问题,还没有解决,Pydev Brainwy tracker 上也开了一张 #497 的票,显然这将在下一个版本中解决。

标签: python python-3.x pydev


【解决方案1】:

来自open() function 文档:

encoding 是用于对文件进行解码或编码的编码名称。这应该只在文本模式下使用。 默认编码取决于平台(无论locale.getpreferredencoding() 返回什么),但可以使用 Python 支持的任何编码。

强调我的。您不应该依赖默认编码;显然 PyDev 环境已设置为 ASCII 为默认编解码器的语言环境。

如果您事先知道您的 CSV 编码为 UTF-8,请在打开文件时明确设置编解码器,并且不要假设您运行它的系统已将 UTF-8 配置为首选文本数据编解码器。

【讨论】:

  • 1- 也许最好明确设置编码。但是,在 Eclipse 中,如果工作区文本编码设置定义为 utf-8,则应使用此设置而不是 ascii ... 2- 为什么它在 Eclipse 中失败,而不是在 Python 或 python shell 中运行时失败?
  • @antoinet:工作区文本编码与 Python 代码中的默认语言环境无关。你在什么系统上运行它(什么操作系统?)。显然 Eclipse 正在改变环境。例如,在 POSIX 系统上,它取决于 LANG 变量选择的语言环境。
  • @MartinPieters 我使用的是 OSX 10.9.5。 Pydev 应该使用与 Python 解释器相同的编码,或者应该在 Eclipse 中有一个设置来定义 pydev 中的默认编码。 Pydev 开发人员计划在下一个版本(Ticket #497)之前解决它。最好的!
  • @antoinet:是的,Pydev 可能应该回显您的系统范围设置。考虑到默认值也可以从 shell 更改为 shell。你的代码永远不应该依赖默认值,真的。
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2011-09-11
相关资源
最近更新 更多