Python读取Salesforce导出的3.6万行CSV文件报错求助
解决Salesforce导出CSV的pandas解析错误问题
针对你遇到的ParserError(EOF在字符串中、字段数不匹配),核心原因是Salesforce导出的CSV可能包含内嵌逗号、未闭合引号或字段内换行符——Excel的解析逻辑更宽松所以显示正常,但pandas默认的C解析引擎对格式要求严格。以下是具体解决方法:
方法1:用csv模块预读取再转DataFrame
csv模块的解析容错性比pandas默认引擎更好,先读取所有行再转为DataFrame:
import csv import pandas as pd rows = [] # skipinitialspace忽略逗号后的空格,QUOTE_ALL强制识别引号包裹的字段 with open('File.csv', 'r', encoding='ISO-8859-1') as f: reader = csv.reader(f, skipinitialspace=True, quoting=csv.QUOTE_ALL) for row in reader: rows.append(row) # 表头取第一行,数据从第二行开始构建DataFrame df = pd.DataFrame(rows[1:], columns=rows[0])
方法2:切换pandas的Python解析引擎
pandas的Python引擎基于csv模块开发,容错性更强,直接指定引擎即可:
df = pd.read_csv( 'File.csv', encoding='ISO-8859-1', dtype='str', engine='python', skipinitialspace=True, on_bad_lines='skip' # 可选:跳过无法解析的行,替代已弃用的error_bad_lines参数 )
方法3:排查异常行的具体问题
如果需要定位错误根源,可以找出所有字段数与表头不一致的行,查看具体内容:
import csv with open('File.csv', 'r', encoding='ISO-8859-1') as f: reader = csv.reader(f, skipinitialspace=True) header = next(reader) expected_cols = len(header) # 从第2行开始遍历(表头是第1行) for line_num, row in enumerate(reader, start=2): if len(row) != expected_cols: print(f"行号{line_num}: 实际字段数{len(row)},预期{expected_cols}") print(f"内容片段: {row[:5]}...") # 打印前5个字段避免输出过长
通常这类问题是因为某字段包含未闭合的引号,或者富文本字段里有换行符,找到后可以手动修复或针对性处理。
内容的提问来源于stack exchange,提问作者E_Sarousi
相关产品推荐
相关产品推荐

