【问题标题】:Encoding issue using pd.read_csv() to read csv file in S3 location使用 pd.read_csv() 在 S3 位置读取 csv 文件的编码问题
【发布时间】:2021-09-23 20:44:31
【问题描述】:

问题:我在尝试使用 pd.read_csv() 读取 S3 位置中的 CSV 文件时遇到编码错误。

下面是我的代码:

 # parameters
 s3_bucket = 'my_bucket'
 s3_key = 'my_key'

 # create s3 client
 s3_client = boto3.client('s3')

 # create s3 object
 obj = s3_client.get_object(Bucket=s3_bucket, Key=s3_key)
   
 # read csv file from s3
 df = pd.read_csv(obj['Body'], encoding='cp1252')

但这是我得到的错误: 'utf-8' 编解码器无法解码位置 0 中的字节 0xff:无效起始字节

当我将编码指定为“cp1252”时,我不明白为什么会出现编码错误。顺便说一句,“cp1252”是我为我的 csv 文件找到的编码。

【问题讨论】:

    标签: python pandas amazon-s3 boto3


    【解决方案1】:

    我查看了boto3 documentation 并且get_object() 方法返回了StreamBody。 pandas 方法read_csv() 将路径、文件、缓冲区等作为输入(documentation)。

    因此,我认为您必须先转换对象主体。这可以通过 Python 的 io 模块 (documentation) 来完成。以下代码应该可以解决您的问题:

    obj = s3_client.get_object(Bucket=s3_bucket, Key=s3_key)
    df = pd.read_csv(io.BytesIO(obj['Body'].read()))
    

    说明: 文档中的 Pandas 状态:

    通过类文件对象,我们指的是具有 read() 方法的对象,例如文件句柄(例如通过内置的 open 函数)或 StringIO。

    这是通过将StreamBody 赋予io.BytesIO 来实现的,您可以从中读取文件的字节。

    【讨论】:

    • df = pd.read_csv(io.BytesIO(obj['Body'].read()), encoding='cp1252') - 谢谢,没有更多错误,但我尝试了这个和一些打印(df)时我得到一个空的df的原因。我的 csv 文件不是空的。
    • 不客气!你能检查io.BytesIO(obj['Body'].read()的长度是否为零吗?
    • 我得到 '80' 使用:bio = io.BytesIO(obj['Body'].read()) print(sys.getsizeof(bio))
    • print(bio.decode("utf-8")) 的输出是什么?或print(bio.decode("cp1252"))?有了这个字节应该被转换成一个字符串,你应该看到数据。
    • '_io.BytesIO' 对象没有属性 'decode' - 这是我得到的错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2022-11-01
    • 2015-07-27
    • 2018-07-16
    相关资源
    最近更新 更多