Python保存CSV至S3存储桶时出现编码错误及实现问询
嘿,我来帮你搞定这个编码问题!先解决你当前的本地保存编码报错,再给你一个不用绕本地文件、直接把数据写入S3的方案(完全不用Pandas哦)。
解决CSV编码错误+直接上传S3的方案
一、先搞定本地保存的编码问题
你遇到的编码错误,大概率是因为保存文件时没指定正确的编码(比如UTF-8),或者数据里包含非ASCII字符导致的。试试这样修改你的代码:
import csv import os import boto3 # 你的原始数据 data = [[None, u'https://aaa.com/p/cat.do?tags=|5555|4444|8888&zzz;A=3', u'00.00.00.000, 00.00.00.000', u'25359725', u'2018-03-06 18:01:18', u'DC01F54GH8D.aa201', None, 1814498434, 765651, u'2018-03-12 18:01:18', 168, 0, u'2...']] # 关键:指定UTF-8编码+处理特殊字符 local_file = "temp_data.csv" with open(local_file, 'w', encoding='utf-8', newline='', errors='replace') as f: writer = csv.writer(f, quoting=csv.QUOTE_ALL) writer.writerows(data) # 上传到S3 s3 = boto3.client('s3') s3.upload_file(local_file, '你的存储桶名称', 's3里的文件路径/data.csv') # 删除本地临时文件 os.remove(local_file)
重点注意这几个细节:
- 打开文件时明确指定
encoding='utf-8',确保特殊字符能正确写入 - 添加
newline=''避免Windows系统下生成多余空行 errors='replace'可以自动替换无法编码的特殊字符,防止直接报错csv.QUOTE_ALL把所有字段用引号包裹,避免带逗号的字段破坏CSV格式
二、更优解:直接写入S3,完全跳过本地文件
其实不用绕本地文件这一步,咱们可以直接在内存里生成CSV内容,然后上传到S3,既省磁盘空间又更高效:
import csv import io import boto3 data = [[None, u'https://aaa.com/p/cat.do?tags=|5555|4444|8888&zzz;A=3', u'00.00.00.000, 00.00.00.000', u'25359725', u'2018-03-06 18:01:18', u'DC01F54GH8D.aa201', None, 1814498434, 765651, u'2018-03-12 18:01:18', 168, 0, u'2...']] # 在内存中生成CSV内容 output = io.StringIO() writer = csv.writer(output, quoting=csv.QUOTE_ALL) writer.writerows(data) # 将指针移到内存流开头,准备读取内容 output.seek(0) # 直接上传到S3 s3 = boto3.client('s3') s3.put_object( Bucket='你的存储桶名称', Key='s3里的文件路径/data.csv', Body=output.getvalue(), ContentType='text/csv; charset=utf-8' ) # 关闭内存流 output.close()
这样就彻底避免了本地文件的编码问题,全程在内存里处理,效率更高~
内容的提问来源于stack exchange,提问作者kab
相关产品推荐
相关产品推荐

