Pandas在不同机器上读取CSV时指定编码的行为不一致问题
问题原因
1. 文件传输损坏
你在两台设备上看到的文件看起来一致,大概率是传输过程中出了问题:如果从Mac往树莓派传文件时用了ASCII传输模式(比如部分旧FTP工具默认模式),UTF-8编码下占2字节的é(字节为0xC3 0xA9)会被截断或修改,导致树莓派上的文件实际存储的是无效字节。用UTF-8解码时无效字节会默认替换为?,所以读入后索引匹配会失败。
你可以在两台设备上都执行以下命令验证字节是否一致:
xxd data/team_list.csv | grep 'Jos.*State'
正常UTF-8编码的é对应的字节应为c3a9,如果树莓派返回的字节不同,就是传输导致的文件损坏。
2. 树莓派locale配置异常
如果验证文件字节完全一致,问题就出在树莓派的系统locale配置:如果树莓派默认locale设置为C/POSIX(ASCII编码),即使你明确指定encoding='utf-8',旧版本pandas在处理索引、字符串输出时仍可能调用系统默认编码做转换,导致Unicode字符被替换为问号。
你可以在树莓派上执行locale命令验证,如果LC_ALL、LC_CTYPE等项的值不是UTF-8结尾,就属于配置异常。
解决方法
确保文件传输一致性
传输文件时使用二进制模式:scp、rsync等工具默认就是二进制模式,不会修改文件内容;如果用FTP工具,先执行bin命令切换到二进制模式再传输。修改树莓派locale为UTF-8
执行以下命令修改locale配置:sudo dpkg-reconfigure locales在弹出的界面中勾选你需要的UTF-8 locale(比如
en_US.UTF-8、zh_CN.UTF-8),并将其设为系统默认,重启终端后生效。手动控制编码逻辑(兜底方案)
如果上述方法都不生效,可以绕过pandas的编码处理,自己读取文件字节解码后再加载为DataFrame,完全屏蔽平台差异:import io import pandas as pd with open('data/team_list.csv', 'rb') as f: # 手动按UTF-8解码文件字节 content = f.read().decode('utf-8') df = pd.read_csv(io.StringIO(content), names = ['col1', 'col2', 'col3', 'col4'], index_col = 0)
内容的提问来源于stack exchange,提问作者Ike348

