UnicodeDecodeError:“utf-8”编解码器无法解码位置 1 中的字节 0x8b:访问 csv 文件时起始字节无效

sum*_*man 0 amazon-s3 python-3.x pandas

我正在尝试从 aws s3 存储桶访问 csv 文件并收到错误“utf-8”编解码器无法解码位置 1 中的字节 0x8b:下面是无效的起始字节代码我正在使用 python 3.7 版本

        from io import BytesIO
        import boto3
        import pandas as pd
        import gzip
        s3 = boto3.client('s3', aws_access_key_id='######',
        aws_secret_access_key='#######')

        response = s3.get_object(Bucket='#####', Key='raw.csv')
        # print(response)
        s3_data = StringIO(response.get('Body').read().decode('utf-8')

        data = pd.read_csv(s3_data)
        print(data.head())
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题

fil*_*den 5

您收到的错误意味着您从此 S3 存储桶获取的 CSV 文件未使用 UTF-8 进行编码。

\n\n

不幸的是,CSV 文件格式的规定相当不明确,并且并不真正包含有关文件内使用的字符编码的信息...因此,您要么需要知道编码,要么您可以猜测它,或者您可以尝试检测它。

\n\n

如果您想猜测一下,流行的编码是 ISO-8859-1(也称为 Latin-1)和 Windows-1252(大致是 Latin-1 的超集)。ISO-8859-1 没有定义字符0x8b(因此这不是正确的编码),但 Windows-1252 使用该代码来表示左单角引号 (\xe2\x80\xb9)。

\n\n

那么也许尝试一下.decode(\'windows-1252\')

\n\n

如果您想检测它,请查看chardet Python 模块,给定一个文件或 BytesIO 或类似文件,该模块将尝试检测文件的编码,为您提供它认为正确的编码以及置信度它具有编码检测功能。

\n\n

最后,我建议,不要使用显式的decode()StringIO 对象来存储文件的内容,而是将原始字节存储在 an 中,io.BytesIOpd.read_csv()通过向其传递编码参数来解码 CSV。

\n\n
import io\n\ns3_data = io.BytesIO(response.get(\'Body\').read())\n\ndata = pd.read_csv(s3_data, encoding=\'windows-1252\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

作为一般实践,您希望尽可能延迟解码。在这种特殊情况下,访问原始字节可能非常有用,因为您可以使用它将它们的副本写入本地文件(然后您可以使用文本编辑器或在 Excel 上进行检查)。

\n\n

另外,如果您想检测编码(例如使用 chardet),则需要在解码之前执行此操作,因此在这种情况下您再次需要原始字节,因此这是使用的另一个优点这里是 BytesIO。

\n