簡體   English   中英

有沒有辦法使用 Python 合並上傳到 AWS S3 存儲桶的多個 CSV 文件?

[英]Is there a way to merge multiple CSV files uploaded to AWS S3 bucket using Python?

我需要設置一個 AWS Lambda 函數,該函數在新的 CSV 文件上傳到 S3 存儲桶時觸發,以將 CSV 文件合並為一個主文件(它們將具有相同數量的列和列名),然后上傳新的主文件到另一個 S3 存儲桶。

我將 Python 用於 Lambda 函數。 我用我的 Lambda 函數和我使用的依賴項(Pandas 和 Numpy)創建了一個 zip 文件夾並上傳了它。

目前,我必須在 zip 文件夾本身中包含我想要合並在一起的 CSV 文件,當我簽入 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 文件,並且還需要將輸出的 Master CSV 文件放在單獨的 S3 存儲桶中。

我建議您使用Amazon Athena執行此操作。

  • CREATE EXTERNAL TABLE以定義 Amazon S3 中的輸入位置和格式
  • CREATE TABLE AS以使用查詢(例如SELECT * FROM input-table )定義 Amazon S3 中的輸出位置和格式(CSV Zip)

這樣,就無需下載、處理和上傳文件。 這一切都將由亞馬遜雅典娜完成。 另外,如果輸入文件被壓縮,成本會更低,因為 Athena 是根據從磁盤讀取的數據量收費的。

您可以從 AWS Lambda 函數調用 Amazon Athena。 只要確保它只所有輸入文件就位后才調用 Athena。

嘗試以下代碼:確保首先下載 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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM