You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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]))

额外优化点

  1. 用with语句管理文件,自动释放资源,避免泄漏。
  2. 路径使用原始字符串r"路径",防止转义字符(如\U、\r)引发错误。
  3. 访问列表元素前先判断长度,避免因解析异常再次触发索引错误。

内容的提问来源于stack exchange,提问作者jinxz02

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:57:16