【问题标题】:Python encoding issue (possibly from windows to linux issue)Python 编码问题(可能是从 windows 到 linux 的问题)
【发布时间】:2015-03-03 06:38:40
【问题描述】:

我正在开发一个在 windows 下用 python 编写的程序。它正在读取 cvs 文件。以下是部分代码:

with open(os.path.abspath(self.currencies_file_path), 'r') as f:
    reader = csv.reader(f)
    #for each row find whether such isocode exists in the table
    for row in reader:   #THis is line 49

这是错误:

  File "whatever/staticdata.py", line 49, in upload_currencies
    for row in reader:
  File "/usr/lib/python3.4/codecs.py", line 313, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf3 in position 1307: invalid continuation byte

csv 文件甚至没有用 utf-8 编码(我认为)。为什么我会遇到这种问题?

附:我对编码一无所知。

【问题讨论】:

  • 你知道编码文件是用什么写的吗?
  • @user590028 不知道有没有办法确定?
  • 我认为是 latin1。

标签: python linux csv encoding


【解决方案1】:

要检查文件编码,可以使用file命令:

$ file utils.py
utils.py: Python script, UTF-8 Unicode text executable

要转换文件,可以使用 iconv 命令:

iconv -f ascii -t utf-8 utils.py -o utils.utf8.py

选项:-f: from-encoding; -t:转编码; -o 输出文件。

最后但同样重要的是,显式声明编码(在 shebang 的右上方):

# -*- coding: utf-8 -*-

因此,对于一个工作示例,您将有如下内容:

#/usr/bin/env python
# -*- coding: utf-8 -*-

iconv支持的编码列表,可以输入:

iconv -l

【讨论】:

  • 这是我的 cvs 文件:data/currencies.csv: ISO-8859 text 为什么我会遇到这种问题?
  • Windows 和 linux 使用不同的默认编码。在 Linux 上通常是 UTF-8。我很确定你的脚本中没有编码行(以 # -*- coding 开头的行。如果你不告诉 python 你使用哪一个,我认为它默认使用 ascii。可能有不同的回退在 linux 和 windows 上。但最好是明确地告诉它它是什么
  • 哦,等一下,您说的是 CSV 文件,而不是 python 文件。不过还是用 iconv 命令来转换吧。
  • 所以python默认尝试utf-8,这就是它不起作用的原因?
  • 默认情况下必须使用locale(通常是utf-8)或utf-8。但是读取 csv 文件使用与启动 python 脚本相同的过程,它默认使用语言环境
【解决方案2】:

如果你认为它是 latin-1,试试这个:

import io
with io.open(os.path.abspath(self.currencies_file_path), encoding='latin-1') as f:
    reader = csv.reader(f)
    for row in reader:

【讨论】:

    【解决方案3】:

    Windows 可能正在使用 CP-1252。

    没有办法知道,100% 的时间,文件正在使用哪种编码,请参阅this StackOverflow question 以供参考。如果您使用的是 Python3 ,只需指定打开文件时要使用的编码。如果你使用的是 Python 2,可以use io.open to specify an encoding 使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      相关资源
      最近更新 更多