Python内存中清理分号分隔CSV字符串 移除字段数不符无效行
实现方案
你已经完成了有效行的筛选逻辑,后续只需要借助Python内置的io.StringIO实现内存中的CSV写入即可,全程不会操作本地磁盘,同时csv.writer会自动处理带分号字段的双引号转义,完全匹配原格式要求。
核心逻辑:
- 用
io.StringIO开辟内存文本缓冲区,替代本地文件对象 - 初始化
csv.writer时保持和读取时一致的分隔符、引用符配置,设置引用规则为非数字字段自动加双引号,匹配原始CSV格式 - 将筛选出的有效行的ID字段转为整数(保证输出时不会被加双引号),写入内存缓冲区
- 最后从缓冲区取出拼接完成的完整字符串即可
完整实现代码
import csv import io myString = '''1;"toto@toto.com";"Toto";"Tata" 2;"BAD_DATA" "BAD_DATA" 3;"alice@alice;com";"Alice";"Dupont" 4;"bob@bob.fr";"Bob";"Morane"''' lines = myString.splitlines() reader = csv.reader(lines, delimiter=';', quotechar='"') # 初始化内存缓冲区,不写入本地文件 output_buffer = io.StringIO() # 初始化writer,配置和reader完全匹配,非数字字段自动加双引号 writer = csv.writer( output_buffer, delimiter=';', quotechar='"', quoting=csv.QUOTE_NONNUMERIC ) for row in reader: if len(row) == 4: # 将第一列ID转为整数,保证输出时不带双引号,和原格式一致 row[0] = int(row[0]) writer.writerow(row) # 获取最终处理完成的CSV字符串 result = output_buffer.getvalue() output_buffer.close() # 验证输出 print(result)
输出效果
运行代码后得到的result完全匹配预期:
1;"toto@toto.com";"Toto";"Tata" 3;"alice@alice;com";"Alice";"Dupont" 4;"bob@bob.fr";"Bob";"Morane"
说明:如果实际业务中ID字段可能包含非数字内容、不需要严格保持ID无引号的格式,可以去掉
row[0] = int(row[0])的转换,同时将quoting参数改为csv.QUOTE_MINIMAL即可,此时仅包含分隔符/特殊字符的字段会被自动加双引号,不影响CSV的正确解析。
内容的提问来源于stack exchange,提问作者Arnaud Stephan
相关产品推荐
相关产品推荐

