CSV文件按条件删除指定行并写入新文件时出现输出格式异常的技术求助
问题排查与修复方案
嘿,你的代码问题出在直接把读取到的字符串行传给csv.writer.writerow()——writerow()方法需要的是一个包含各字段的列表(或者可迭代的字段集合),但你传的是完整的字符串,它就会把字符串的每个字符当成独立字段,这才导致输出文件里每行字符都用逗号分隔的奇怪格式。
具体修复步骤
我们应该用csv.reader来正确解析每行的字段,而不是直接按行读字符串。这样不仅能解决格式问题,还能让你的条件判断更精准(避免比如某个字段的子串刚好匹配条件文本的误判情况)。
修正后的完整代码
import os import csv # 先定义你的判断条件(示例:匹配Category为transport且Description为operation) target_description = "operation" target_category = "transport" with open("filename.csv", "r") as input_file, open("output.csv", "w", newline='') as output_file: # 用csv.reader解析输入文件 csv_reader = csv.reader(input_file) csv_writer = csv.writer(output_file) # 先写入表头行 header = next(csv_reader) csv_writer.writerow(header) # 遍历每一行数据 for row in csv_reader: # 按字段索引判断条件(Category是第2列,索引1;Description是第4列,索引3) if row[1] == target_category and row[3] == target_description: print(f"即将删除的行:{row}") else: csv_writer.writerow(row) # 替换原文件 os.remove('filename.csv') os.rename('output.csv', "filename.csv")
更友好的优化写法
如果觉得记字段索引麻烦,可以用csv.DictReader和csv.DictWriter,直接通过字段名来判断条件,代码可读性会强很多:
import os import csv target_description = "operation" target_category = "transport" with open("filename.csv", "r") as input_file, open("output.csv", "w", newline='') as output_file: csv_reader = csv.DictReader(input_file) csv_writer = csv.DictWriter(output_file, fieldnames=csv_reader.fieldnames) csv_writer.writeheader() for row in csv_reader: if row["Category"] == target_category and row["Description"] == target_description: print(f"即将删除的行:{row}") else: csv_writer.writerow(row) os.remove('filename.csv') os.rename('output.csv', "filename.csv")
额外小提示
- 打开输出文件时加上
newline=''是csv模块的官方推荐写法,能避免Windows和Linux系统下的换行符不一致问题。 - 原代码里用
r+模式打开原文件完全没必要,只读模式r就足够了,因为我们是生成新文件后替换原文件,不会直接修改原文件内容。
内容的提问来源于stack exchange,提问作者Chan Yong sheng
相关产品推荐
相关产品推荐

