使用boto3 python计算s3中csv文件的行数

3
我正在努力寻找正确的方法来读取和解析CSV文件,以便输出其中包含的行数。
我正在尝试使用不同的方法,但是遇到了一些困难。
import boto3, botocore, csv

s3 = boto3.resource('s3')
s3obj = s3.Object('mybucket','myfile')

with s3obj.get() as f:
    reader=csv.reader(f,delimter=",")
    data=list(reader)
    row_count=len(date)

这显然没有起作用,因为要么语法错误,要么我不知道我在做什么。我参考了这篇文章,并尝试使用s3进行实现。

csv文件中的行数

是否可以在s3对象上执行csv.reader函数,而不是明确打开文件?使用s3obj.get()?

请原谅我的无知,我还在学习编程,任何解释都会非常有帮助。

3个回答

3
我使用Python中的普通计数方法,成功地获得了期望的结果。
import boto3, botocore

s3 = boto3.resource('s3')
s3obj = s3.Object( 'mybucket', 'myfile')

filedata= s3obj.get()["Body"].read()


print (filedata.decode('utf8').count('\n')-1)

1

之前的回答很好,但有时会出现以下错误:

'utf-8' 编解码器无法解码位置 127 的字节 0xf3:无效的连续字节

如果出现此问题,请尝试以下方法:

filedata.decode('ISO-8859-1').count('\n')-1

1
返回一个 dict 响应。您需要从响应中获取 Body,这是对象数据(StreamingBody)。
s3obj = s3.Object('mybucket','myfile')
content = s3obj.get()['Body']

但是这个StreamingBody仅支持read(),不支持csv.reader()所需的迭代器协议。


谢谢您的解释。我想我已经成功了,我必须从总计数中减去1来考虑标题行。不确定这是否是最佳实践。 - Huzaifa M Aamir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接