使用保留列表筛选CSV行时误删所有内容的技术问题
问题分析与修复方案
原代码存在的问题
- 路径处理错误:Windows路径中的反斜杠未转义,会被Python解析为转义字符,导致路径识别异常。
- 重复创建读取器:已通过
csvReader读取表头,后续又重新创建csv.reader(inCountryName),会导致文件读取位置混乱,可能无法获取有效数据。 - 逻辑判断完全错误:内层循环中把字符串
name和列表countryList直接比较(永远不相等),且循环逻辑颠倒——本该保留国家在列表中的行,实际却把每一行重复写入len(countryList)次,同时因为文件被提前清空,最终出现内容丢失。 - 未写入表头:读取了表头但未写入输出文件,结果会丢失CSV的结构信息。
- 同时读写同一文件:用
w模式打开文件会立即清空原内容,此时原文件的读取操作无法正常获取数据。
修正后的代码
import csv # 目标国家列表 countryList = ['Azerbaijan', 'Belarus', 'China', 'Estonia', 'Finland', 'Georgia', 'Kazakhstan', 'Latvia', 'Lithuania', 'Mongolia', 'North Korea', 'Norway', 'Poland', 'Ukraine', 'United States', 'Venezuala'] # 用原始字符串处理Windows路径,避免转义问题 file_path = r"C:\Capstone\Data\WIID_30JUN2022_Altered.csv" # 先读取所有符合条件的行到内存 with open(file_path, "r", newline="", encoding="utf-8") as infile: reader = csv.reader(infile) header = next(reader) country_index = header.index("country") # 筛选保留表头和国家在列表中的行 filtered_rows = [header] + [row for row in reader if row[country_index] in countryList] # 写入筛选后的内容到原文件 with open(file_path, "w", newline="", encoding="utf-8") as outfile: writer = csv.writer(outfile) writer.writerows(filtered_rows)
关键修改说明
- 路径改为原始字符串,避免转义字符引发的路径错误。
- 先将所有符合条件的行读取到内存,再写入文件,彻底避免同时读写同一文件的冲突。
- 用列表推导式简化筛选逻辑,直接判断国家是否在目标列表中,符合条件才保留。
- 明确写入表头,保证输出文件的结构完整性。
- 添加
newline=""和指定编码,避免CSV写入时出现多余空行或编码乱码问题。
内容的提问来源于stack exchange,提问作者Mackenzie Alice
相关产品推荐
相关产品推荐

