如何让Python csv.reader()正确读取含内部双引号的CSV文件?
解决CSV内部双引号解析错误的问题
问题根源
你的CSV数据不符合标准规范:字段内的双引号需要用两个双引号转义,但第二行的"UMBRELLA 21""写法错误——csv.reader会把第二个"当成字段结束符,导致后续的,0,...被错误拆分,最终解析出的字段数量不足,触发IndexError。
解决方案
方案1:修正源CSV文件(推荐)
按照CSV规范,字段内的双引号必须转义为两个双引号。将错误行:
icode,"UMBRELLA 21"",0, , , ,0,"cat2",1,"ecode","O"
改为:
icode,"UMBRELLA 21""",0, , , ,0,"cat2",1,"ecode","O"
修改后csv.reader可正确解析出字段值UMBRELLA 21"。
方案2:读取时预处理修复错误格式
如果无法修改源文件,可在读取每行数据前先修复双引号错误。修改代码如下:
import csv import re # 修复CSV行内的双引号错误:将字段内单个末尾双引号替换为两个 def fix_quotes(line): return re.sub(r'(?<="[^",]+)"(?=,)', r'""', line) # 用原始字符串避免路径转义问题,with语句自动管理文件 with open(r"C:\Users\usern\Desktop\ref\data.txt", "r") as f: # 逐行修复后交给csv.reader解析 fixed_lines = (fix_quotes(line) for line in f) reader = csv.reader(fixed_lines) for data in reader: # 跳过空行 if not data: continue x = data data1 = x[0] data2 = x[1].replace("'", "CHAR(39)") data3 = x[2] # 先判断列表长度再访问元素,避免索引越界 data4 = x[3] if len(x)>=4 else '0000-00-00' if data4 == ' ': data4 = '0000-00-00' data5 = x[4] if len(x)>=5 else '0000-00-00' if data5 == ' ': data5 = '0000-00-00' data6 = x[5] if len(x)>=6 else '0000-00-00' if data6 == ' ': data6 = '0000-00-00' data7 = x[6] if len(x)>=7 else '' data8 = x[7] if len(x)>=8 else '' data9 = x[8] if len(x)>=9 else '' data10 = x[9] if len(x)>=10 else '' data11 = x[10] if len(x)>=11 else '' print(','.join([data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11]))
额外优化点
- 用
with语句管理文件,自动释放资源,避免泄漏。 - 路径使用原始字符串
r"路径",防止转义字符(如\U、\r)引发错误。 - 访问列表元素前先判断长度,避免因解析异常再次触发索引错误。
内容的提问来源于stack exchange,提问作者jinxz02
相关产品推荐
相关产品推荐

