使用pandas.to_csv导出Snowflake数据为csv时特殊字符乱码如何解决
乱码问题解决方案
你遇到的乱码是典型的编码不匹配导致的字符转义错误:原始Snowflake中的长破折号(–,Unicode U+2013)的UTF-8编码是0xE2 0x80 0x93,如果这段字节流被错误地用Latin-1/Windows-1252编码读取,三个字节就会被分别解析为â、€、“三个字符,也就是你看到的‚Äì序列。
你的代码存在两处编码未显式声明的隐患:
- pandas的
to_csv方法在不同运行环境下默认编码不一定是UTF-8,Windows环境下默认会用GBK/CP1252编码写入 - 后续追加表头的
open操作也没有指定编码,读写的编码规则和to_csv写入时的编码不匹配,就会触发乱码
修复方案
方案1:统一显式指定UTF-8编码(最通用,兼容S3、SFTP传输场景)
修改两处代码即可解决问题:
- 给
to_csv添加encoding参数显式指定编码
query_output.fetch_pandas_all().to_csv(file_name, index=False, quoting=csv.QUOTE_ALL, header=False, encoding='utf-8')
- 给
open操作也显式指定相同编码
with open(file_name, 'r+', encoding='utf-8') as f:
如果你的SFTP接收方要求用其他编码(比如GBK、适配Windows Office的UTF-8 BOM),可以直接替换上面的encoding参数值即可,比如需要给Windows系统用户打开的CSV可以传encoding='utf-8-sig'避免Office打开乱码。
方案2:优化表头写入逻辑(从根源降低编码出错概率)
你当前先写内容再追加表头的操作需要读写两次文件,会额外增加编码匹配风险,你可以直接在to_csv阶段就写入表头,省略后续修改文件的步骤:
# 直接提取表头列表传入to_csv header_list = [col[0] for col in cur.description] query_output.fetch_pandas_all().to_csv(file_name, index=False, quoting=csv.QUOTE_ALL, header=header_list, encoding='utf-8')
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

