pandas read_csv读取逗号分隔CSV无法正确分列的原因是否为编码问题
问题根因判定
这个问题和你设置的latin-1编码完全无关。encoding='latin-1'的作用是把文件存储的字节流解码成可识别的文本,解决土耳其语特殊字符的乱码问题,整个解码过程不会改动逗号这类分隔符的本身属性,也不会干扰pandas对分隔符的识别逻辑,根本不存在编码设置导致拆分失败的可能性。
拆分失效的真实原因,对着运行输出的特征就能直接定位:
- 跑完代码后pandas压根没对任何分隔符做拆分,把整行内容全塞到了第一列里。结合文件里的数值格式(示例值
23.137,18,点当千分位分隔符、逗号当小数点),这类从土耳其当地业务系统导出的CSV,实际都是用分号;当列分隔符的——要是真用逗号当列分隔符,数值内部当小数点用的逗号会把字段拆得七零八落,导出程序会自动换成分号当列分隔符。你一直用pandas默认的逗号拆分规则,自然识别不对。 - 输出结果里的双引号细节也能佐证这个判断:列头、数据值外层带的引号,就是因为pandas把整行识别成单个字符串的时候,把原本包裹在每个独立字段外面的双引号也当成了普通文本,才会出现引号没被正常剥离的现象。
修复方案
调整read_csv的匹配参数,对齐文件的实际格式就行:
df = pd.read_csv( "UECM_5year.csv", encoding="latin-1", sep=";", thousands=".", decimal="," )
各参数的作用:
sep=";":匹配文件实际的分号列分隔规则thousands=".":指定数值里的点是千分位标记decimal=",":指定数值里的逗号是小数点标记
调完之后pandas会自动把字段外面的双引号剥掉,正确拆分开每一列,同时把数值字段识别为数字类型,再也不会出现整行挤在一列里的问题。
内容的提问来源于stack exchange,提问作者Emin Baybars Timur
相关产品推荐
相关产品推荐

