Pandas读取含内部双引号的CSV时如何保留正确格式?
解决Pandas读取非标准CSV时内部引号丢失的问题
这个问题出在你的CSV格式不符合标准规范——标准CSV中,字段内的双引号需要用两个双引号来转义(比如"A ""Great"" Experience"),但你的原始数据里是单个双引号,导致Pandas的解析器误把内部的引号当成了字段的结束标记,从而丢失了一个引号。
下面提供两种可行的解决方法:
方法一:用CSV模块自定义解析规则
直接利用Python内置的csv模块,通过设置escapechar参数来识别字段内的单个双引号,再转成DataFrame:
import csv import pandas as pd # 读取并解析文件 rows = [] with open(file2Name, 'r', encoding='utf-8') as f: # delimiter是分隔符|,quotechar是字段包围符",escapechar指定用"来转义内部的" reader = csv.reader( f, delimiter='|', quotechar='"', escapechar='"', quoting=csv.QUOTE_ALL, skipinitialspace=False ) for row in reader: rows.append(row) # 转成DataFrame(如果有表头就取第一行当列名,否则直接传入rows) df = pd.DataFrame(rows)
这样解析后,你就能得到预期的结果:[1, A "Great" Experience, T]
方法二:预处理CSV文件,修正格式
如果需要长期处理这类非标准CSV,可以先把文件转换成标准格式(将内部单个双引号替换为两个),再用Pandas读取:
import pandas as pd # 预处理文件 with open(file2Name, 'r', encoding='utf-8') as infile, open('fixed.csv', 'w', encoding='utf-8') as outfile: for line in infile: # 按|分割字段,处理每个字段内的引号 parts = line.strip().split('|') fixed_parts = [] for part in parts: if part.startswith('"') and part.endswith('"'): # 去掉首尾引号,替换内部"为"",再重新加引号 inner_content = part[1:-1].replace('"', '""') fixed_parts.append(f'"{inner_content}"') else: fixed_parts.append(part) # 重新拼接成一行写入新文件 outfile.write('|'.join(fixed_parts) + '\n') # 读取修正后的标准CSV df = pd.read_csv('fixed.csv', sep='|', keep_default_na=False, quoting=csv.QUOTE_ALL)
额外建议
如果可以控制CSV的生成源头,建议直接生成标准格式的CSV:把字段内的双引号用两个双引号转义,比如正确的行应该是:
"1"|"A ""Great"" Experience"|"T"
这样你原来的pandas.read_csv参数就能直接正确解析,不需要额外处理。
内容的提问来源于stack exchange,提问作者Sowmika
相关产品推荐
相关产品推荐

