zwe*_*nde 7 python gzip amazon-s3 boto
我正在尝试使用boto从S3流式传输.gz文件并迭代解压缩的文本文件的行.神秘地,循环永远不会终止; 读取整个文件后,迭代将在文件开头重新开始.
假设我创建并上传如下输入文件:
> echo '{"key": "value"}' > foo.json
> gzip -9 foo.json
> aws s3 cp foo.json.gz s3://my-bucket/my-location/
Run Code Online (Sandbox Code Playgroud)
我运行以下Python脚本:
import boto
import gzip
connection = boto.connect_s3()
bucket = connection.get_bucket('my-bucket')
key = bucket.get_key('my-location/foo.json.gz')
gz_file = gzip.GzipFile(fileobj=key, mode='rb')
for line in gz_file:
print(line)
Run Code Online (Sandbox Code Playgroud)
结果是:
b'{"key": "value"}\n'
b'{"key": "value"}\n'
b'{"key": "value"}\n'
...forever...
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我认为必须有一些我非常缺乏的基本知识.
zwe*_*nde 10
啊,博托.问题是如果在密钥完全读取一次之后调用它,则read方法会重新下载密钥(比较读取和下一个方法以查看差异).
这不是最干净的方法,但它解决了这个问题:
import boto
import gzip
class ReadOnce(object):
def __init__(self, k):
self.key = k
self.has_read_once = False
def read(self, size=0):
if self.has_read_once:
return b''
data = self.key.read(size)
if not data:
self.has_read_once = True
return data
connection = boto.connect_s3()
bucket = connection.get_bucket('my-bucket')
key = ReadOnce(bucket.get_key('my-location/foo.json.gz'))
gz_file = gzip.GzipFile(fileobj=key, mode='rb')
for line in gz_file:
print(line)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2949 次 |
| 最近记录: |