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)
请帮我解决这个问题
您收到的错误意味着您从此 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)。
那么也许尝试一下.decode(\'windows-1252\')?
如果您想检测它,请查看chardet Python 模块,给定一个文件或 BytesIO 或类似文件,该模块将尝试检测文件的编码,为您提供它认为正确的编码以及置信度它具有编码检测功能。
\n\n最后,我建议,不要使用显式的decode()StringIO 对象来存储文件的内容,而是将原始字节存储在 an 中,io.BytesIO并pd.read_csv()通过向其传递编码参数来解码 CSV。
import io\n\ns3_data = io.BytesIO(response.get(\'Body\').read())\n\ndata = pd.read_csv(s3_data, encoding=\'windows-1252\')\nRun Code Online (Sandbox Code Playgroud)\n\n作为一般实践,您希望尽可能延迟解码。在这种特殊情况下,访问原始字节可能非常有用,因为您可以使用它将它们的副本写入本地文件(然后您可以使用文本编辑器或在 Excel 上进行检查)。
\n\n另外,如果您想检测编码(例如使用 chardet),则需要在解码之前执行此操作,因此在这种情况下您再次需要原始字节,因此这是使用的另一个优点这里是 BytesIO。
\n| 归档时间: |
|
| 查看次数: |
11622 次 |
| 最近记录: |