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