Các câu trả lời khác trong chuỗi này có liên quan đến boto, nhưng S3.Object không thể lặp lại được nữa trong boto3. Vì vậy, sau đây không hoạt động, nó tạo ra một thông báo TypeError: 's3.Object' object is not iterable
lỗi:
s3 = boto3.session.Session(profile_name=my_profile).resource('s3')
s3_obj = s3.Object(bucket_name=my_bucket, key=my_key)
with io.FileIO('sample.txt', 'w') as file:
for i in s3_obj:
file.write(i)
Trong boto3, nội dung của các đối tượng có sẵn tại S3.Object.get()['Body']
mà không phải là một iterable một trong hai, vì vậy sau vẫn không hoạt động:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for i in body:
file.write(i)
Vì vậy, một sự thay thế là sử dụng phương pháp đọc, nhưng điều này nạp các đối tượng S3 WHOLE trong bộ nhớ mà khi giao dịch với các tập tin lớn không phải lúc nào một khả năng:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for i in body.read():
file.write(i)
Nhưng phương pháp read
cho phép truyền vào tham số amt
chỉ định số byte mà chúng tôi muốn đọc từ luồng cơ bản. Phương pháp này có thể được lặp đi lặp lại gọi cho đến khi toàn bộ dòng đã được đọc:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
while file.write(body.read(amt=512)):
pass
Đào vào botocore.response.StreamingBody
một mã nhận ra rằng dòng cơ bản cũng có sẵn, vì vậy chúng tôi có thể lặp như sau:
body = s3_obj.get()['Body']
with io.FileIO('sample.txt', 'w') as file:
for b in body._raw_stream:
file.write(b)
Trong khi googling tôi cũng nhìn thấy một số liên kết có thể được sử dụng, nhưng tôi đã không cố gắng:
Các [smart_open] (https://github.com/piskvorky/smart_open) thư viện Python làm điều đó (cả đọc và viết). – Radim