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)