csv.reader转义符失效:无法保留\032格式字符问题
CSV解析时保留非引号字段中的\032转义序列问题
我的CSV文件中有一行内容:
zeroconf.net,TXT,rockview\032entrance._http._tcp.ietf98,"\"path=/\"",2023-05-14T01:41:55.954Z,""
我期望解析后得到:
['zeroconf.net', 'TXT', 'rockview\\032garage._http._tcp.ietf98', '"path=/\"', '2023-05-14T01:41:55.954Z', '']
但使用以下csv.reader配置时,"\"path=/\""字段解析正常,rockview\032garage._http._tcp.ietf98却被转换成rockview032garage._http._tcp.ietf98,不符合预期:
csv.reader(f, doublequote=False, escapechar="\\", quotechar='"', quoting=csv.QUOTE_MINIMAL)
实际解析结果:
['zeroconf.net', 'TXT', 'rockview032garage._http._tcp.ietf98', '"path=/\"', '2023-05-14T01:41:55.954Z', '']
问题原因
问题出在escapechar="\\"的配置上——csv.reader会将所有位置的反斜杠视为转义符,自动移除反斜杠并保留后续字符。对于非引号包裹的rockview\032...字段,解析器会把\0当成转义组合,直接去掉反斜杠,导致\032变成032。
解决方案
要兼顾引号字段的正常解析和非引号字段中反斜杠的保留,可以先预处理CSV内容,将非引号区域内的单个反斜杠替换为两个反斜杠(让解析器将其识别为普通反斜杠),再进行解析:
import csv from io import StringIO # 读取原始CSV文件内容 with open("your_file.csv", "r", encoding="utf-8") as f: raw_content = f.read() # 预处理:仅转义非引号内的反斜杠 processed_chars = [] in_quote = False for char in raw_content: if char == '"': in_quote = not in_quote processed_chars.append(char) elif char == "\\" and not in_quote: # 非引号内的反斜杠替换为两个,让解析器保留单个反斜杠 processed_chars.append("\\\\") else: processed_chars.append(char) processed_content = "".join(processed_chars) # 解析处理后的内容 with StringIO(processed_content) as f: reader = csv.reader(f, doublequote=False, escapechar="\\", quotechar='"', quoting=csv.QUOTE_MINIMAL) for row in reader: print(row)
这样处理后,非引号字段中的\032会被保留,同时引号字段的解析逻辑不受影响,最终得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Thong Nguyen
相关产品推荐
相关产品推荐

