如何正确解析含特殊字符与内部逗号的PostgreSQL导出CSV文件?
问题
从PostgreSQL导出的车辆详情CSV文件存在数据异常,解析时碰到两个棘手问题:
- 老款路虎车型的英寸标识(比如
100")被转义成了"100'"",用csv.reader(encoding="utf8")直接解析会报错; - 要是直接用
split(",")拆分文本,又会把带内部逗号的引号包裹字段(比如"R1, STREETFIGHTER")错误拆成'"R1'和' STREETFIGHTER"'。
现有代码如下:
in_file = open(in_folder + in_file, "r", encoding="utf8") for line in in_file: row_list = line.split(",")
请问怎么实现不拆分引号内文本的CSV行解析?必须自己写解析逻辑吗?
解决方案
完全不需要自己写解析逻辑,Python自带的csv模块支持自定义引号和转义规则,刚好能适配PostgreSQL导出的这种格式:
1. 核心配置:指定引号与转义符
PostgreSQL导出CSV时,默认用双引号包裹字段,并用单引号转义字段内的双引号。只要给csv.reader设置两个参数就能解决问题:
quotechar='"':识别双引号作为字段的包裹符;escapechar="'":把单引号当作双引号的转义符号,遇到'后面跟着的"就知道是字段内的内容,不是字段结束标记。
2. 完整可运行代码
import csv # 用with语句自动管理文件,比直接open更安全 with open(in_folder + in_file, "r", encoding="utf8") as in_file: reader = csv.reader(in_file, quotechar='"', escapechar="'") for row in reader: # row就是解析后的完整行列表,引号内的逗号不会被拆分 # 比如"R1, STREETFIGHTER"会变成列表里的单个元素"R1, STREETFIGHTER" # "100'""会被解析成"100"" print(row)
3. 为什么这能解决你的两个问题
- 针对英寸标识的转义问题:
escapechar="'"让csv.reader正确识别"100'""里的'"是字段内的",不会把它当成字段结束符,解析后得到正常的100"; - 针对引号内逗号的拆分问题:
quotechar='"'"会把双引号包裹的整块内容当作单个字段,里面的逗号不会被当作分隔符,完美保留R1, STREETFIGHTER的完整性。
内容的提问来源于stack exchange,提问作者Doc Tim
相关产品推荐
相关产品推荐

