是否可以使用Python合并上传到AWS S3存储桶的多个CSV文件?

时间:2019-07-02 01:24:29

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

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

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

当前,我必须将要合并的CSV文件包括在zip文件夹中,当我在CloudWatch中签入时,该功能会合并这些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()

我不想每次都不必在与python脚本相同的zip文件夹中手动输入CSV文件,也不需要将输出的CSV主文件保存在单独的S3存储桶中。

2 个答案:

答案 0 :(得分:0)

我建议您使用 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。只需确保仅在所有输入文件都放置到位之后 即可调用雅典娜。

答案 1 :(得分:0)

试试下面的代码:确保先下载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')