首页 > 解决方案 > boto3:文件内容长度正确但正文为空

问题描述

我在 S3 存储桶中有一个大小为 4.4MB 的文件,当我尝试通过 boto3 下载它时,我在对象描述中看到的内容长度是正确的,但对象的主体是空的。任何想法为什么会这样?

s3 = session.client('s3')    
obj = s3.get_object(Bucket=bucket, Key=key)
obj['ResponseMetadata']['HTTPHeaders']['content-length'] ## this returns 4598667
obj['ContentLength'] ## this returns 4598667 as well
obj['Body'].read().decode('utf-8') ## this returns ''

标签: amazon-web-servicesboto3

解决方案


所以正如评论中提到的,关键是使用csv.reader()obj['Body'].read().decode('utf-8').splitlines()(完整的代码可以在这里找到。)

为什么流媒体还没有处理这个问题?

关于 csv.reader (来自文档):

返回一个读取器对象,它将遍历给定 csvfile 中的行。csvfile 可以是任何支持迭代器协议的对象,并在每次调用其next () 方法时返回一个字符串——文件对象和列表对象都适用。如果 csvfile 是一个文件对象,它应该用 newline='' 打开。

从 csv 文件读取的每一行都作为字符串列表返回。除非指定了 QUOTE_NONNUMERIC 格式选项,否则不会执行自动数据类型转换

话虽如此,我们必须遍历 csv.reader 的返回数据才能看到实际的行。

代码片段示例:

import csv
with open('eggs.csv', newline='') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
     for row in spamreader:
         print(', '.join(row))
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

推荐阅读