Python编码问题(可能从windows到linux问题)

时间:2015-01-05 17:05:21

标签: python linux csv encoding

我正在开发一个用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编码(我想)。为什么我会遇到这种问题?

P.S。我对编码一无所知。

3 个答案:

答案 0 :(得分:2)

如果您认为它是拉丁语-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:

答案 1 :(得分:0)

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

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

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

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

最后但并非最不重要的是,明确声明编码(位于shebang下方的右上方):

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

因此,对于一个有效的例子,你会有类似的东西:

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

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

iconv -l

答案 2 :(得分:0)

Windows可能正在使用CP-1252。

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