S3:如何在不下载完整文件的情况下进行部分读/读?

时间:2016-04-05 20:08:38

标签: http amazon-s3 http-headers

虽然它们类似于文件,但是Amazon S3中的对象并不是真正的“文件”,就像S3存储桶不是真正的目录一样。在Unix系统上,我可以使用head来预览文件的前几行,无论它有多大,但我不能在S3上执行此操作。那么如何对S3进行部分阅读呢?

4 个答案:

答案 0 :(得分:39)

S3文件可能很大,但你不必只是为了读取前几个字节而获取整个文件。 S3 API支持HTTP Range:标头http://imgur.com/yjf7snN,它采用字节范围参数。

只需在S3请求中添加Range: bytes=0-NN标头,其中NN是要读取的请求字节数,您只需获取那些字节而不是读取整个文件。现在,您可以预览在S3存储桶中保留的900 GB CSV文件,而无需等待整个内容下载。阅读亚马逊开发者文档中的(see RFC 2616)

答案 1 :(得分:5)

AWS .Net SDK仅显示可能的固定结束范围(RE:public ByteRange(long start, long end))。如果我想从中间开始并阅读到底怎么办? HTTP范围Range: bytes=1000-完全可以接受"从1000开始并读到结束"我不相信他们在.Net库中允许这样做。

答案 2 :(得分:2)

get_object api 具有用于部分读取的 arg

s3 = boto3.client('s3')
resp = s3.get_object(Bucket=bucket, Key=key, Range='bytes={}-{}'.format(start_byte, stop_byte-1))
res = resp['Body'].read()

答案 3 :(得分:0)

使用Python可以预览压缩文件的第一条记录。

使用boto连接。

#Connect:
s3 = boto.connect_s3()
bname='my_bucket'
self.bucket = s3.get_bucket(bname, validate=False)

从gzip压缩文件中读取前20行

#Read first 20 records
limit=20
k = Key(self.bucket)
k.key = 'my_file.gz'
k.open()
gzipped = GzipFile(None, 'rb', fileobj=k)
reader = csv.reader(io.TextIOWrapper(gzipped, newline="", encoding="utf-8"), delimiter='^')
for id,line in enumerate(reader):
    if id>=int(limit): break
    print(id, line)

因此,它等效于以下Unix命令:

zcat my_file.gz|head -20