Python读取CSV文件到DataFrame时出现空值及行数翻倍问题
嘿,我来帮你搞定这个麻烦——读取分号分隔的CSV后全是空值,行数还翻倍,这种情况我碰到过好几次,大概率是文件的换行符、编码或者实际分隔符的问题,给你几个具体的排查和解决方向:
1. 先试试指定换行符
如果你的CSV是Windows系统生成的,换行符是\r\n,但在Linux/macOS下读取时,pandas可能会把\r当成奇怪的字符,导致解析出错。直接指定换行符试试:
import pandas as pd data = pd.read_csv('testfile.csv', sep=';', lineterminator='\r\n')
要是反过来,Linux生成的文件在Windows读,就把lineterminator改成'\n'。
2. 检查文件编码是否正确
很多时候全空值是因为编码不匹配——比如文件是GBK编码,但pandas默认用UTF-8读取,就会解析失败。你可以挨个试试常用编码:
# 先试试GBK(Windows常见编码) data = pd.read_csv('testfile.csv', sep=';', encoding='gbk') # 或者UTF-16(如果是Unicode格式的文件) data = pd.read_csv('testfile.csv', sep=';', encoding='utf-16')
要是不确定编码,用chardet库检测一下(需要先通过pip install chardet安装):
import chardet with open('testfile.csv', 'rb') as f: encoding_result = chardet.detect(f.read()) print(f"检测到的编码是:{encoding_result['encoding']}")
然后把检测到的编码填到encoding参数里就行。
3. 确认分隔符真的是半角分号
有时候看起来是分号,实际是全角分号(;),或者分号前后带空格(比如 ;),这时候pandas就找不到分隔符了。先看看文件前几行的真实内容:
with open('testfile.csv', 'r') as f: print("文件前5行内容:") for line in f.readlines()[:5]: print(repr(line))
如果是全角分号,就把sep改成';';如果是带空格的,用sep='\s*;\s*'(匹配任意空格+分号+任意空格)。
4. 跳过空行试试
行数翻倍可能是文件里每一行后面都跟着空行,虽然pandas默认跳过空行,但有时候会失效,手动指定一下:
data = pd.read_csv('testfile.csv', sep=';', skip_blank_lines=True)
5. 用csv模块手动读取排查
要是以上都不行,就用Python内置的csv模块先读一遍,看看解析出来的内容是什么样的,这样能更直观找到问题:
import csv import pandas as pd parsed_rows = [] with open('testfile.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f, delimiter=';') for row in reader: parsed_rows.append(row) # 先打印前几行看看解析结果 print("解析后的前5行:") for row in parsed_rows[:5]: print(row) # 转成DataFrame data = pd.DataFrame(parsed_rows[1:], columns=parsed_rows[0])
这样你就能看到每一行是不是被正确拆分了,要是这里的parsed_rows都是空的,那肯定是文件本身的格式问题;要是正常,那就是pandas的参数没调好。
内容的提问来源于stack exchange,提问作者Gaurav Raina

