使用S3Hook download_fileobj下载至临时文件为空,求排查测试方案
S3Hook download_fileobj下载文件后临时文件内容为空的排查方案
我使用S3Hook的download_fileobj方法将S3文件下载至临时文件,但读取该临时文件时发现内容为空,文件并未成功保存。已通过列举keys确认目标文件存在且Bucket信息正确,请问还可执行哪些测试来排查该故障?
我的代码:
s3hook = S3Hook("my conn") s3_key = f'moft/2023-05.txt' logging.info(f'Downloading s3 file {s3_key} to be encrypted') keys = s3hook.list_keys(bucket_name="my bucket", prefix='moft/', delimiter="/") logging.info(f'keys: {keys}') s3_obj = s3hook.get_key(key=s3_key, bucket_name="my bucket") logging.info(f's3_obj {s3_obj}') logging.info(f'self.s3_bucket {"my bucket"}') # dl file from s3, to encrypt temp_file = f'/tmp/airflow1/file_to_encrypt_2023-05.txt' # Writing downloaded to /tmp/ data = open(temp_file, 'wb') s3_obj.download_fileobj(data) logging.info(f'data_name {data.name}') with open(temp_file, 'r') as f: logging.info(f.read())
可执行的排查测试:
- 检查文件句柄的缓冲区刷新与关闭:当前代码打开文件后未关闭句柄,
download_fileobj写入的数据可能仍在内存缓冲区未刷入磁盘。可以改用with open(temp_file, 'wb') as data:的上下文管理器自动管理句柄,或手动调用data.flush()和data.close()后再读取文件。 - 验证S3对象本身是否为空:打印
s3_obj.content_length,确认目标S3文件的实际大小。如果该值为0,说明文件本身无内容。 - 检查临时路径的读写权限与目录存在性:用
os.path.exists(os.path.dirname(temp_file))确认目录存在,用os.access(temp_file, os.W_OK)验证文件写入权限;必要时提前执行os.makedirs(os.path.dirname(temp_file), exist_ok=True)确保目录存在。 - 直接读取S3对象内容:跳过本地文件步骤,调用
logging.info(s3_obj.get()['Body'].read()),确认S3对象本身能否正常读取到数据。 - 检查临时文件的实际大小:下载完成后执行
logging.info(os.path.getsize(temp_file)),如果返回0说明未写入数据;如果有大小但读取为空,需排查编码问题(比如二进制写入后用文本模式读取,或文件含特殊编码)。 - 替换下载方法测试:改用
s3hook.download_file(s3_key, temp_file, bucket_name="my bucket")替代download_fileobj,验证是否能正常写入文件,排除download_fileobj的使用问题。
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

