Python处理含引号内逗号的CSV文件并转换为字典
处理带引号包裹逗号的CSV数据问题
问题场景
需要处理外部供应商提供的CSV数据,列数固定但行数可变。示例数据如下:
Version,Relative Path,Author,Date,Comment,Link 1,somePath,someperson,01/20/2020,"Some phrase with punctuation including comas, but in which case it seems to be automatically formatted with quotes...",some.url 3,somePath,someperson,01/20/2020,Simple comment with no punctuation,another.url 50,somePath,someperson,01/20/2020,Another comment,some.url
原处理代码使用csv.DictReader,但带逗号的Comment字段被错误拆分,导致字典结构混乱。已知含逗号的评论均被双引号"包裹,需保留评论内的逗号,且仅使用Python 3.10.2标准库解决。
解决方案
Python标准库的csv模块默认支持识别双引号包裹的字段,自动忽略字段内的分隔符(逗号)。原代码出现问题可能是未显式指定编码或方言参数,以下是修正后的代码:
import csv # 根据实际文件编码调整(如utf-8-sig、gbk) with open("sample.csv", "r", encoding="utf-8") as csvFile: # 使用excel方言,自动处理双引号包裹的字段 reader = csv.DictReader(csvFile, dialect="excel") data = {} for row_dict in reader: for key, value in row_dict.items(): # 用setdefault替代列表拼接,提升效率 data.setdefault(key, []).append(value) print(data)
说明
csv.DictReader默认的excel方言完全符合CSV标准:双引号包裹的字段内的逗号会被视为字段内容的一部分,不会被当作分隔符拆分,自然保留评论内的逗号。- 若文件存在编码异常,需在
open时指定正确编码(比如utf-8-sig用于处理带BOM的UTF-8文件)。 - 使用
dict.setdefault替代原代码的列表拼接方式,避免频繁创建新列表,处理大文件时效率更高。
内容的提问来源于stack exchange,提问作者Lauloque
相关产品推荐
相关产品推荐

