CSV文件分隔符替换:将双引号外的逗号替换为~
解决CSV中非引号内逗号替换为~的问题
嘿,我太懂你这个反向结果的糟心了——处理带引号的CSV时,很容易因为没搞清楚引号的转义和边界,把该留的逗号换了,该换的反而留下。别用正则硬怼了,CSV的规则比看起来复杂(比如字段里的转义双引号""),用专门的CSV处理工具才是正道!
推荐方法:用Python的csv模块(最可靠)
Python内置的csv模块会自动处理CSV的引号规则,完美区分“分隔用的逗号”和“字段内部的逗号”。直接用它读取每行,再用~作为分隔符重新写入就行:
import csv # 替换成你的输入输出文件路径 input_path = "your_input.csv" output_path = "your_output.csv" with open(input_path, 'r', newline='', encoding='utf-8') as infile, \ open(output_path, 'w', newline='', encoding='utf-8') as outfile: # 读取CSV,自动识别带引号的字段(不管里面有没有逗号) csv_reader = csv.reader(infile) # 写入CSV,指定分隔符为~,自动处理需要引号的字段 csv_writer = csv.writer(outfile, delimiter='~', quoting=csv.QUOTE_MINIMAL) for row in csv_reader: csv_writer.writerow(row)
为什么这个方法管用?
csv.reader会把每一行拆成列表,带双引号的字段会被完整识别成一个列表元素,里面的逗号完全不会被当成分隔符。csv.writer用~连接列表元素,原来作为分隔符的逗号(不在引号里的)就被替换成了~;而字段内部的逗号会被保留,如果字段里包含~或者换行符,writer还会自动给字段加上双引号,符合CSV规范。
如果你之前用了正则(为什么会反向?)
比如你可能写了类似(?<=".*),(?=.*")的正则,试图匹配引号内的逗号替换,但这种正则会因为引号的转义(比如"He said, ""Hello""")或者跨行字段失效,反而把不该换的换了。正则只适合简单的CSV场景,复杂场景下还是用专门的库更稳。
内容的提问来源于stack exchange,提问作者Sudeep Adhya
相关产品推荐
相关产品推荐

