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



我正在尝试从 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())

请在这里帮助我如何解决这个问题

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

不幸的是,CSV 文件格式的指定不足,并没有真正包含有关文件内使用的字符编码的信息......所以要么你需要知道编码,要么你可以猜测它,或者你可以尝试检测它。

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

所以也许试试.decode('windows-1252')

如果你想检测它,请查看chardet Python模块,给定一个文件或BytesIO或类似的东西,它将尝试检测文件的编码,给你它认为正确的编码是什么,以及它在检测编码方面的置信度。

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

import io
s3_data = io.BytesIO(response.get('Body').read())
data = pd.read_csv(s3_data, encoding='windows-1252')

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

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

使用 gzip 对我有用

client = boto3.client('s3', aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key)
csv_obj = client.get_object(Bucket=####, Key=###)
body = csv_obj['Body']
with gzip.open(body, 'rt') as gf:
csv_file = pd.read_csv(gf)

相关内容

最新更新