UnicodeDecodeError:' utf8'编解码器不能解码字节0xea

时间:2016-12-21 21:33:32

标签: python

我有一个CSV文件,我通过HTML表单上传到Python API

API如下所示:

@app.route('/add_candidates_to_db', methods=['GET','POST'])
def add_candidates():
    file = request.files['csv_file']
    x = io.StringIO(file.read().decode('UTF8'), newline=None)
    csv_input = csv.reader(x)
    for row in csv_input:
        print(row)

我找到了导致问题的文件部分。在我的文件中,它有Í个字符。

我收到此错误:UnicodeDecodeError: 'utf8' codec can't decode byte 0xea in position 1317: invalid continuation byte

我以为我是用.decode('UTF8')解码它,或者是file.read()之前发生的错误?

我该如何解决这个问题?

** **

编辑:我控制了文件。我通过拉取数据自己创建CSV文件(有时这些数据有奇怪的字符)。

在服务器端,我正在读取文件中的每一行并插入数据库。

2 个答案:

答案 0 :(得分:2)

您的数据不是UTF-8,它包含错误。您说您正在生成数据,因此理想的解决方案是生成更好的数据。

不幸的是,有时我们无法获得高质量的数据,或者我们的服务器会给我们带来垃圾,我们必须将其整理出来。对于这些情况,我们可以在解码文本时使用不太严格的错误处理。

而不是:

file.read().decode('UTF8')

您可以使用:

file.read().decode('UTF8', 'replace')

这样可以使任何“垃圾”字符(任何未正确编码为UTF-8的字符)都被U + FFFD取代,如下所示:

  

您说您的文件具有Í字符,但您可能正在使用UTF-8以外的编码查看该文件。您的文件是否应该包含Í,还是只是mojibake?也许你可以弄清楚角色应该是什么,从中你可以弄清楚你的数据使用的编码是不是UTF-8。

答案 1 :(得分:-1)

您的文件似乎未在utf8中编码。您可以尝试使用all the encodings that Python understand读取文件并检查哪个文件可以读取文件的全部内容。试试这个脚本:

from codecs import open

encodings = [
    "ascii",
    "big5",
    "big5hkscs",
    "cp037",
    "cp424",
    "cp437",
    "cp500",
    "cp720",
    "cp737",
    "cp775",
    "cp850",
    "cp852",
    "cp855",
    "cp856",
    "cp857",
    "cp858",
    "cp860",
    "cp861",
    "cp862",
    "cp863",
    "cp864",
    "cp865",
    "cp866",
    "cp869",
    "cp874",
    "cp875",
    "cp932",
    "cp949",
    "cp950",
    "cp1006",
    "cp1026",
    "cp1140",
    "cp1250",
    "cp1251",
    "cp1252",
    "cp1253",
    "cp1254",
    "cp1255",
    "cp1256",
    "cp1257",
    "cp1258",
    "euc_jp",
    "euc_jis_2004",
    "euc_jisx0213",
    "euc_kr",
    "gb2312",
    "gbk",
    "gb18030",
    "hz",
    "iso2022_jp",
    "iso2022_jp_1",
    "iso2022_jp_2",
    "iso2022_jp_2004",
    "iso2022_jp_3",
    "iso2022_jp_ext",
    "iso2022_kr",
    "latin_1",
    "iso8859_2",
    "iso8859_3",
    "iso8859_4",
    "iso8859_5",
    "iso8859_6",
    "iso8859_7",
    "iso8859_8",
    "iso8859_9",
    "iso8859_10",
    "iso8859_13",
    "iso8859_14",
    "iso8859_15",
    "iso8859_16",
    "johab",
    "koi8_r",
    "koi8_u",
    "mac_cyrillic",
    "mac_greek",
    "mac_iceland",
    "mac_latin2",
    "mac_roman",
    "mac_turkish",
    "ptcp154",
    "shift_jis",
    "shift_jis_2004",
    "shift_jisx0213",
    "utf_32",
    "utf_32_be",
    "utf_32_le",
    "utf_16",
    "utf_16_be",
    "utf_16_le",
    "utf_7",
    "utf_8",
    "utf_8_sig",
]

for encoding in encodings:
    try:
        with open(file, encoding=encoding) as f:
            f.read()
        print('Seemingly working encoding: {}'.format(encoding))
    except:
        pass

其中file再次是文件的文件名。