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

时间:2017-03-04 00:10:49

标签: python python-3.x csv count boto3

我正在努力寻找正确的方法来读取和解析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)

这显然不起作用,因为1,语法错误或数字2我不知道我在做什么。 我参考了这篇文章,并尝试使用s3实现它。

Row count in a csv file

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

请原谅我的无知仍在学习编程,所有任何解释都会非常有用

3 个答案:

答案 0 :(得分:1)

s3obj.get()会返回dict个回复。您必须从响应中获取Body,即对象数据(StreamingBody)。

s3obj = s3.Object('mybucket','myfile')
content = s3obj.get()['Body']

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

答案 1 :(得分:0)

通过在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)

答案 2 :(得分:0)

上一个答案的效果很好,但有时会出现以下错误:

  

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

如果是这样,请尝试:

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