将pandas数据帧直接写入压缩CSV到Amazon s3存储桶?

ros*_*ipi 6 python csv amazon-s3 amazon-web-services pandas

我目前有一个脚本,它读取保存到s3的现有csv版本,将其与pandas数据帧中的新行组合,然后将其直接写回s3.

    try:
        csv_prev_content = str(s3_resource.Object('bucket-name', ticker_csv_file_name).get()['Body'].read(), 'utf8')
    except:
        csv_prev_content = ''

    csv_output = csv_prev_content + curr_df.to_csv(path_or_buf=None, header=False)
    s3_resource.Object('bucket-name', ticker_csv_file_name).put(Body=csv_output)
Run Code Online (Sandbox Code Playgroud)

有没有办法,我可以这样做,但使用gzip压缩csv?我想在s3上读取现有的.gz压缩csv(如果有的话),将其与数据帧的内容连接起来,然后直接在s3中用新的组合压缩csv覆盖.gz,不必制作本地副本.

ram*_*ser 13

这是使用Pandas 0.20.1的Python 3.5.2中的解决方案.

可以从S3,本地CSV或其他任何内容读取源DataFrame.

import boto3
import gzip
import pandas as pd
from io import BytesIO, TextIOWrapper

df = pd.read_csv('s3://ramey/test.csv')
gz_buffer = BytesIO()

with gzip.GzipFile(mode='w', fileobj=gz_buffer) as gz_file:
    df.to_csv(TextIOWrapper(gz_file, 'utf8'), index=False)

s3_resource = boto3.resource('s3')
s3_object = s3_resource.Object('ramey', 'new-file.csv.gz')
s3_object.put(Body=gz_buffer.getvalue())
Run Code Online (Sandbox Code Playgroud)

  • @szu,因为pandas.io.formats.format.CSVFormatter是通过这种方式实现的。我想这个想法是,如果您要提供流,那么您可以自己设置必要的处理...。或者开发人员根本不在乎在此提供和测试“明智的”实现,并且没人关心到目前为止,已解决此问题(可悲的是,您现在不能轻易地修复它,而不必破坏他人的代码)。 (2认同)