Azure环境下pandas.read_csv读取CSV文件编码设置不生效如何解决
问题解决方案
根因分析
问题的核心出在pysftp.Connection.open()方法的默认行为:该方法默认以文本模式打开远程文件,会优先使用运行环境的系统默认编码对文件内容做解码。
- Azure运行环境为Linux,默认系统编码是utf-8,所以打开文件时就已经用utf-8尝试解码,解码失败直接抛出错误,此时你传递给
pd.read_csv的encoding参数仅对未解码的二进制流生效,完全不会被触发。 - 本地Windows环境的默认系统编码刚好和文件编码cp1252匹配,所以本地运行无报错。
修复方案
方案1:以二进制模式打开SFTP文件(推荐)
将SFTP文件读取模式改为二进制只读模式rb,把原始二进制流传给pandas,让pandas处理编码逻辑:
with pysftp.Connection(host, username=username, password=password, cnopts=cnopts) as sftp: for i in sftp.listdir_attr(): # 新增rb参数,以二进制模式打开文件 with sftp.open(i.filename, 'rb') as f: df = pd.read_csv(f, delimiter=';', encoding='cp1252')
方案2:在SFTP打开阶段指定编码
如果要保持文本模式读取,直接在sftp.open时指定编码,不需要在pandas中重复设置:
with pysftp.Connection(host, username=username, password=password, cnopts=cnopts) as sftp: for i in sftp.listdir_attr(): with sftp.open(i.filename, 'r', encoding='cp1252') as f: df = pd.read_csv(f, delimiter=';')
补充注意事项
从你提供的报错栈可以看到,实际运行的代码中pd.read_csv指定的编码是utf-8-sig,请确认你部署到Azure的代码和本地测试的代码版本一致,避免部署了未更新的旧代码。
内容的提问来源于stack exchange,提问作者choka
相关产品推荐
相关产品推荐

