amazon-web-services - 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 ''
解决方案
所以正如评论中提到的,关键是使用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
推荐阅读
- sql - SQL拆分字符串并获取NULL值而不是空字符串
- tsql - 尝试将临时表中的列值设置为空字符串时出现问题
- javascript - JS递归检查对象字段(+嵌套)为假/真
- python - 通过鼠标单击从板上选择方块的有效方法(Python 3.X. tkinter)
- java - PowerMockito.mockStatic() 但在调用静态方法时仍然得到 NPE
- debugging - 如何防止条件语句中不需要的变量赋值?
- mongodb - Docker容器未连接mongodb主机
- app-store - 发布免费应用程序,但按月订阅
- google-analytics - 谁有集成 GTM 电子商务分析 fot Prestashop 的经验
- laravel - 在所有模型中实施全局范围