Python读取CSV文件时逗号分隔符失效:部分行无法正确拆分
问题原因与解决方案
从你提供的CSV内容和代码来看,导致后续行无法正确拆分到对应列的主要原因有这几个:
1. 未闭合的引号与字段内嵌入的逗号
看第二行的内容:
2021/05/31,2012,"10","S","","Dis","DI","EX,,0.00,,"Pt",0,
这里存在一个严重的格式错误:"EX,,0.00,, 这个部分的引号没有正确闭合,而且字段内部还包含了逗号。pandas.read_csv 默认会把被quotechar(默认是双引号)包裹的内容当作单个字段,但如果引号未闭合,它会把整行剩余的内容都归为这个未闭合的字段,自然就无法按照表头拆分到对应列了。
2. HTML转义的引号干扰解析
你的CSV里用了"(HTML的双引号转义字符),而read_csv 默认不会识别这种转义,它会把"当作普通字符串的一部分,而不是实际的引号。这就导致原本应该被引号包裹的字段(比如"10")无法被正确识别,进一步加剧了解析混乱。
3. 行尾的多余逗号(次要)
你提供的两行数据末尾都有多余的逗号,这会导致解析时出现额外的空列,也会影响列的匹配,但这不是核心问题。
解决方案
我们可以先预处理CSV内容,修复格式问题后再解析:
步骤1:处理HTML转义的引号
先把所有"替换成实际的双引号",让read_csv能正确识别引号包裹的字段。
步骤2:修复未闭合的引号
检查并修复行内未闭合的引号(比如行内引号数量为奇数的情况,补充引号闭合)。
步骤3:用pandas解析处理后的内容
下面是具体的代码实现:
import pandas as pd from io import StringIO # 读取原始CSV文件并处理转义引号 with open(r'C:\file.csv', 'r', encoding='utf-8') as file: raw_content = file.read().replace('"', '"') # 修复未闭合的引号(处理行内引号数量为奇数的情况) fixed_lines = [] for line in raw_content.split('\n'): if not line.strip(): fixed_lines.append(line) continue quote_count = line.count('"') if quote_count % 2 != 0: # 假设最后一个引号未闭合,先去掉行尾多余逗号再补引号 line = line.rstrip(',') + '"' fixed_lines.append(line) # 生成修复后的内容并解析为DataFrame fixed_content = '\n'.join(fixed_lines) df = pd.read_csv(StringIO(fixed_content), sep=',', quotechar='"') print(df.head())
如果你的CSV里还有其他格式问题(比如特定字段的引号错误),可能需要根据实际内容调整修复逻辑,但上面的代码应该能解决你当前遇到的核心问题。
内容的提问来源于stack exchange,提问作者rose




