使用smart_open流式下载HTTP的.gz文件并上传S3失败,求排查
问题分析与修正方案
核心错误
代码里存在一个致命的逻辑错误:你在写入S3时调用了fout.write(chunk_size),这会把chunk_size的数值(16777216)重复写入文件,而不是写入从HTTP流读取到的实际文件内容buf。这是导致代码无法正常工作的直接原因。
其他潜在问题与优化建议
- S3权限配置:确保smart_open能正确访问你的S3存储桶,可通过环境变量、
~/.aws/credentials配置文件,或者在s3://路径的transport_params中显式传入AWS密钥参数。 - 传输参数优化:针对大文件流式上传,可给S3写入添加
transport_params配置,比如设置分片上传相关参数提升效率。 - 异常处理:建议添加异常捕获逻辑,处理网络中断、权限不足等可能出现的异常情况。
修正后的代码
from smart_open import open as sopen chunk_size = 16 * 1024 * 1024 # 16MB 分片大小 http_url = 'http://someurl' with sopen(http_url, 'rb', transport_params={'headers': {'Subscription-Key': 'somekey'}}) as fin: # 若需指定AWS凭证,可添加transport_params参数,示例: # transport_params={'client_kwargs': {'aws_access_key_id': '你的密钥ID', 'aws_secret_access_key': '你的密钥'}} with sopen('s3://bucket/filename.txt.gz', 'wb') as fout: while True: buf = fin.read(chunk_size) if not buf: break fout.write(buf) # 修正为写入读取到的实际内容buf
内容的提问来源于stack exchange,提问作者ffi23
相关产品推荐
相关产品推荐

