【问题标题】:Is there a way to merge multiple CSV files uploaded to AWS S3 bucket using Python?有没有办法使用 Python 合并上传到 AWS S3 存储桶的多个 CSV 文件?
【发布时间】:2019-07-02 01:24:29
【问题描述】:

我需要设置一个 AWS Lambda 函数,当新的 CSV 文件上传到 S3 存储桶时触发,以将 CSV 文件合并到一个主文件(它们将具有相同数量的列和列名),然后是新的主文件文件已上传到另一个 S3 存储桶。

我将 Python 用于 Lambda 函数。我用我的 Lambda 函数和我使用的依赖项(Pandas 和 Numpy)创建了一个 zip 文件夹并上传了它。

目前,当我签入 CloudWatch 时,我必须将要合并在一起的 CSV 文件包含在 zip 文件夹本身中,该函数会合并这些 CSV 文件,并且输出(主文件)在日志中。

我不知道如何将我的代码链接到 S3 存储桶以进行输入和输出。

这是针对我正在开发的应用程序。

这是我正在使用的 python 代码:

    import os
    import glob
    import numpy
    import pandas as pd

    def handler(event, context):
        #find all csv files in the folder
        #use glob pattern matching -> extension = 'csv'
        #save result in list -> all_filenames
        extension = 'csv'
        all_filenames = [i for i in glob.glob('*.{}'.format(extension))]

        #combine all files in the list
        combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames ])

        #export to csv
        combined_csv.to_csv( "/tmp/combined_csv.csv", index=False, encoding='utf-8-sig')
        f = open("/tmp/combined_csv.csv", "r")
        print(f.read())
        f.close()

我希望不必每次都手动将 CSV 文件输入到与我的 python 脚本相同的 zip 文件夹中,并且还希望输出 Master CSV 文件位于单独的 S3 存储桶中。

【问题讨论】:

    标签: python amazon-web-services amazon-s3


    【解决方案1】:

    我建议您使用 Amazon Athena 执行此操作。

    • CREATE EXTERNAL TABLE 在 Amazon S3 中定义输入位置和格式
    • CREATE TABLE AS 用于在 Amazon S3 中定义输出位置并使用查询格式(CSV Zip)(例如 SELECT * FROM input-table

    这样,无需下载、处理和上传文件。这一切都将由 Amazon Athena 完成。另外,如果输入文件被压缩,成本会更低,因为 Athena 是根据从磁盘读取的数据量收费的。

    您可以从 AWS Lambda 函数调用 Amazon Athena。只要确保它只在所有输入文件都准备好之后调用 Athena。

    【讨论】:

    • 好的,我试试。感谢您抽出宝贵时间回答!
    【解决方案2】:

    试试下面的代码:确保先下载 s3fs 然后安装 boto3

    import s3fs
    import pandas as pd
    import boto3
    
    client = boto3.client('s3')
    keys = []
    
    bucket = 'your_bucket'
    
    resp = client.list_objects_v2(Bucket = bucket)
    
    for i in resp['Contents']:
        print(i['Key'])
        if ('prefix' in i['Key']) & ('.csv' in i['Key']): // prefix filter
            n = "s3://" + bucket + "/"+ i['Key']
            print(n)
            keys.append(n)
    
    print(keys)
    data = pd.concat([pd.read_csv((k)) for k in keys])
    print(data)
    data.to_csv( "final.csv", index=False, encoding='utf-8-sig') #use this line if you want to download the file local
    
    path = "s3://bucket_name/folders/" + "filename.csv"
    data.to_csv( path, index=False, encoding='utf-8-sig')
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 2020-05-29
      • 2020-05-20
      • 1970-01-01
      • 2021-04-11
      相关资源
      最近更新 更多