Python无需pandas实现S3桶Excel文件读取后重新上传的问题求解
解决方案
问题根源
Excel(.xlsx)是二进制压缩格式文件,不属于文本文件,不需要做任何字符编码解码操作,你之前的解码操作会直接破坏文件的原始二进制结构,导致最终写入的文件无法正常打开。
可直接运行的正确代码
import boto3 # 初始化S3客户端 s3 = boto3.client('s3') bucket = 'mybucket' source_key = 'name of the file.xlsx' # S3对象键使用正斜杠作为路径分隔符,不要用Windows风格的反斜杠 target_key = 'tmp/filename.xlsx' # 直接读取二进制内容,无需解码 file_response = s3.get_object(Bucket=bucket, Key=source_key) # 直接上传二进制流到目标路径,无需额外封装 s3.put_object( Body=file_response['Body'], Bucket=bucket, Key=target_key )
如果需要对文件内容做二进制层面的修改,也可以先读取为字节对象再处理:
# 读取完整字节内容到内存 file_content = file_response['Body'].read() # 这里可以插入二进制内容处理逻辑,不需要转文本 # 上传处理后的二进制内容 s3.put_object( Body=file_content, Bucket=bucket, Key=target_key )
原有代码错误点说明
- 对二进制格式的Excel文件调用
decode方法做字符解码,直接破坏了文件原始结构,无论换什么编码都无法得到正确的文件内容 - 错误使用
StringIO存储内容,StringIO是文本处理专用的类,二进制内容需使用BytesIO,本场景下完全不需要额外封装IO对象 put_object调用参数格式错误,未显式指定Body、Key参数名,路径拼接使用了非法的反斜杠符号
内容的提问来源于stack exchange,提问作者zsh_18
相关产品推荐
相关产品推荐

