如何用Pandas读取行分隔符数量多于表头的CSV文件?
这个问题我之前也踩过坑!当CSV里的字段本身包含分隔符(逗号)却没按规范用引号包裹时,Pandas的默认解析逻辑很容易把列拆错,但Excel自带的启发式算法却能聪明地识别这种情况并正确合并字段。下面给你几个可行的解决方案,按实用性排序:
解决方案
1. 借助Excel的解析能力(最推荐,适配所有未知列的情况)
既然Excel能正确读取,我们可以先把CSV转成Excel格式,再用Pandas读取。这个方法完全复刻Excel的处理逻辑,不管哪列包含分隔符都能搞定。不过需要你有Excel安装(Windows系统),或者用LibreOffice替代(跨平台)。
Windows下用pywin32实现:
首先安装依赖:
pip install pywin32 pandas
然后运行代码:
import pandas as pd import win32com.client as win32 import os csv_path = os.path.abspath("test.csv") xlsx_path = os.path.abspath("test_converted.xlsx") # 调用Excel后台转换CSV到XLSX excel = win32.gencache.EnsureDispatch("Excel.Application") excel.Visible = False # 不显示Excel窗口,后台运行 try: wb = excel.Workbooks.Open(csv_path) # 51对应XLSX格式,56对应旧版XLS格式 wb.SaveAs(xlsx_path, FileFormat=51) finally: wb.Close() excel.Quit() # 读取转换后的XLSX文件 df = pd.read_excel(xlsx_path) print(df)
跨平台用LibreOffice实现:
如果你用Linux或macOS,可以安装LibreOffice,然后用命令行转换:
libreoffice --headless --convert-to xlsx test.csv
转换完成后,用Pandas读取生成的XLSX文件即可,代码和上面最后部分一致。
2. 手动处理CSV行(适合已知哪些列包含分隔符的情况)
如果明确知道哪些列是可能包含逗号的(比如NAME、PLACE),可以用Python的csv模块逐行读取,手动合并对应的字段,再转成DataFrame。
比如针对你的示例2,已知NAME和PLACE列可能包含逗号:
import pandas as pd import csv rows = [] with open("test.csv", "r") as f: reader = csv.reader(f) headers = next(reader) # 获取表头 for row in reader: # 针对表头A,NAME,B,PLACE的合并逻辑 new_row = [ row[0], # 提取A列 ", ".join(row[1:3]), # 合并第2-3个元素作为NAME列 row[3], # 提取B列 ", ".join(row[4:]) # 合并剩余元素作为PLACE列 ] rows.append(new_row) df = pd.DataFrame(rows, columns=headers) print(df)
这个方法需要你明确知道哪些列需要合并,但灵活性很高,可以根据实际文件的格式调整合并逻辑。
3. 正则表达式分隔符(适合字段有明显格式特征的情况)
如果包含逗号的字段有明显的格式特征(比如字段内的逗号后面没有空格,而列分隔符是逗号加空格),可以用正则表达式作为分隔符,精准匹配列之间的分隔符。
比如,如果你的文件中列分隔符是, (逗号加空格),而字段内的逗号是无空格的,, 可以用:
df = pd.read_csv("test.csv", sep=r',\s', engine='python')
但这个方法依赖文件的格式特征,通用性不如前两种,仅适合有明确格式规律的CSV。
内容的提问来源于stack exchange,提问作者aciba
相关产品推荐
相关产品推荐

