Python 设置S3文件属性中元数据的Content-Encoding值

背景: 使用脚本从S3下载下来的CSV文件打开发现是乱码,但是在网页上面点击下载按钮下载后却能正常打开.

研究发现,在S3文件属性的元数据中有Content-Encoding值是gzip

浏览器下载的时候会识别这个值,然后在帮你自动减压后下载. 但是利用官方boto3包的download_fileobj()方法中,却无法指定对应的参数(不知道以后不会优化).

下载的话就比较简单了,下载后直接利用gzip解压后再处理数据即可.

import boto3
import gzip
import csv

s3 = boto3.client('s3')
bucket = 'my_bucket'
download_key = 'my.csv'
file_path = '/tmp/my.csv'

with open('/tmp/my.csv.gz', 'wb') as file_date:
    s3.download_fileobj(bucket, download_key, file_date)
g = gzip.GzipFile(mode="rb", fileobj=open('/tmp/my.csv.gz', 'rb'))
open(file_path, "wb").write(g.read())
csv_file_open = open(file_path, 'r')
csv_file = csv.reader(csv_file_open)

上传的我研究了好久.因为我发现upload_file()方法中也无法提供Content-Encoding参数,虽然我找到了ExtraArgs参数中可以添加Metadata的字段,然后发现这个是个自定义元数据用的.会自动转换成x-amz-meta-content-encoding.这就很扯淡了.

s3_resource.meta.client.upload_file(file_path, bucket, key, ExtraArgs={'Metadata': {'Content-Encoding': 'gzip'}})

进一步研究发现在copy_object()方法中ContentEncoding 参数才是真正用来设置S3文件属性的元数据中的Content-Encoding值.

所以有一种方法是先用uploadfile上传数据,然后在用copy_object()拷贝后修改Content-Encoding属性.(这样比较蛋疼)

最后发现put_object()方法也带有这个参数,这样的话我们可以利用put_object方法来操作.代码片段如下.自己先压缩好gzip文件.

f = open('/tmp/my_gz.csv', 'rb')
response = s3.put_object(Body=f, Bucket=bucket,  Key='my.csv', ContentEncoding='gzip')

原文地址:https://www.cnblogs.com/crazyzero/p/11727628.html

时间: 2024-08-12 03:20:29

Python 设置S3文件属性中元数据的Content-Encoding值的相关文章

python之路_day70_django中cookie介绍

一.django模板系统 1.母板 为其他子模板文件所共有的内容文件,各子模板的不同部分通过模板语言占位.注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换,如下例: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" con

python设置检查点简单实现

说检查点,其实就是对过去历史的记录,可以认为是log.不过这里进行了简化.举例来说,我现在又一段文本.文本里放有一堆堆的链接地址.我现在的任务是下载那些地址中的内容.另外因为网络的问题或者网站的问题,每次下载可能不会非常的成功.有可能出现断链或者socket异常错误.不过不管产生什么样的错误,我都希望我的程序能够一直跑下去.或者能停掉后,继续从为下载的链接处跑.而不是从开始的地方跑.这个问题非常简单.因为这些链接是上下文无关的(上下文有关的情况要另外分析).所以我只要记录程序运行停止前的最后一条

python第三十六天-----类中的特殊成员方法

__doc__ 查看尖的描述信息 __module__表示当前操作的对象所在的模块 __class__表示当前操作的对象所属的类 __init__构造方法 通过类创建对象自动执行 __del__析构方法,当前对象在内存中被释放自动斩妖执行 __call__对象后面加括号触发执行 __dict__查看类或对象中的成员 __str__如果一个类中定义了此方法,那么打印此类对象时,输出此方法的返回值 __getitem__当类中定义了一个字典的属性成员,可以获取 __setitem__设置修改类中字典

简介Python的collections模块中defaultdict类型

这里我们来简介Python的collections模块中defaultdict类型的用法,与内置的字典类最大的不同在于初始化上,一起来看一下: defaultdict 主要用来需要对 value 做初始化的情形.对于字典来说,key 必须是 hashable,immutable,unique 的数据,而 value 可以是任意的数据类型.如果 value 是 list,dict 等数据类型,在使用之前必须初始化为空,有些情况需要把 value 初始化为特殊值,比如 0 或者 ''. from c

Python设置Headers

Python设置Headers import urllib import urllib2 url = 'http://www.server.com/login' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' values = {'username' : 'cqc', 'password' : 'XXXX' } headers = { 'User-Agent' : user_agent } data = urllib.u

在Python的Django框架中加载模版的方法

在Python的Django框架中加载模版的方法 为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板, 要使用此模板加载API,首先你必须将模板的保存位置告诉框架. 设置的保存文件就是settings.py. 如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧. 它的默认设置是一个空元组(tuple),加上一些自动生成的注释. TEMPLATE_DIRS =

python操作s3 -- boto2.x

以下是python操作s3常用方法,想看boto3等内容,自行看文档 具体的自己看官方文档:http://boto3.readthedocs.org/en/latest/index.html import boto from boto.s3.key import Key #高级连接,当然你需要配置好YOUR_ACCESS_KEY,YOUR_SECRET_KEY,我这里是配好了 conn = boto.connect_s3() #创建一个存储桶 conn.create_bucket('yourbu

Python的Django框架中的Cookie相关处理

Python的Django框架中的Cookie相关处理 浏览器的开发者在很早的时候就已经意识到, HTTP's 的无状态会对Web开发者带来很大的问题,于是(cookies)应运而生. cookies 是浏览器为 Web 服务器存储的一小段信息. 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies 来看看它是怎么工作的. 当你打开浏览器并访问 google.com ,你的浏览器会给Google发送一个HTTP请求,起始部分就象这样: GET / HTTP/1.1 Host:

python操作txt文件中数据教程[1]-使用python读写txt文件

python操作txt文件中数据教程[1]-使用python读写txt文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果 程序实现 filename = './test/test.txt' contents = [] DNA_sequence = [] # 打开文本并将所有内容存入contents中 with open(filename, 'r') as f: for line in f.readlines(): contents.append(line