【问题标题】:Count rows of a csv file in s3 using boto3 python使用boto3 python计算s3中csv文件的行数
【发布时间】:2017-07-24 05:58:27
【问题描述】:

我正在努力寻找正确的方法来读取和解析 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 函数,而不是显式打开文件?

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

【问题讨论】:

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


    【解决方案1】:

    s3obj.get() 返回一个dict 响应。您必须从作为对象数据(StreamingBody)的响应中获取Body

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

    但是这个StreamingBody只支持read(),不支持csv.reader()要求的迭代器协议。

    【讨论】:

    • 感谢您的解释。我想我能够让它工作我必须从总计数中减去 1 来说明标题行。不确定这是否是最佳做法。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      如果是这样,请尝试:

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

      【讨论】:

        猜你喜欢
        • 2021-05-22
        • 2021-07-13
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        • 2020-04-14
        • 2011-10-18
        相关资源
        最近更新 更多