首页 文章

UnicodeDecodeError:'utf8' codec无法解码字节0xea [重复]

提问于
浏览
0

这个问题在这里已有答案:

我有一个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

我以为我用_1783983解码它或者在 file.read() 之前发生了错误?

我该如何解决?


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

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

2 回答

  • -1

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

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

    代替:

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

    您可以使用:

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

    这将使得任何“垃圾”字符(任何未正确编码为UTF-8的字符)都将被替换为U FFFD,如下所示:

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

  • 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 再次是您文件的文件名 .

相关问题