如何使用S3的put_object接口上传文件不损坏日期格式?
问题解决方案
你遇到的日期截断问题可按以下步骤排查修复:
第一步:先验证S3源文件的实际内容
直接在S3控制台找到对应文件,点击「查询」按钮直接预览文件原始内容,或者用aws cli下载文件后用纯文本编辑器(比如记事本、VS Code)打开查看:
- 如果原始文件里日期是完整的
2021-12-02 14:02:40,说明是后续用Excel/Numbers这类表格工具打开CSV时,工具自动将日期字段格式化截断了秒数,和上传过程无关 - 如果原始文件里日期确实已经被截断,再排查上传逻辑问题
第二步:Excel打开时保留完整日期的处理方法
如果是Excel格式化导致的截断,可按以下操作处理:
- 打开Excel后不要直接双击CSV文件,选择「数据」-「自文本/CSV」,选中要打开的文件
- 导入向导中,将日期列的列数据格式设置为「文本」,或者自定义日期格式为
yyyy-mm-dd hh:mm:ss - 完成导入后就能看到完整的日期时间值
第三步:上传侧的优化方案(可选,避免下游工具误格式化)
如果要从根上避免下游工具自动识别日期导致的截断,可在生成CSV时给日期字段加特殊前缀,或者补充上传参数,参考修改后的代码:
import boto3 s3 = boto3.client('s3') bucket_name = "你的桶名" path = "目标文件路径.csv" # 给日期字段前加制表符前缀,避免Excel自动识别为日期类型格式化 csv_records = ['"name","date"', '"ankan","\t2021-12-02 14:02:40"'] body = "\n".join(csv_records) # 显式指定utf-8编码更稳妥 body = body.encode('utf-8') # 上传时指定Content-Type,避免S3自动识别类型异常 s3.put_object( Bucket=bucket_name, Key=path, Body=body, ContentType='text/csv; charset=utf-8' )
内容的提问来源于stack exchange,提问作者Ankan Das
相关产品推荐
相关产品推荐

