
本文介绍一种简洁可靠的python方法,用于逐行读取目标数字列表(来自纯文本文件),并在csv文件中精确匹配任意字段中的数字,找到后输出整行并保存到独立文件。
要解决“搜索多个字符串并在CSV中定位整行”的问题,关键在于:**避免手动重复打开文件、正确处理换行符与空白行、按字段粒度进行匹配(而非粗暴的子串搜索)**。原始代码存在多个典型新手陷阱:多次硬编码重复逻辑、`readline()`仅读首行、`readlines()[1]`未去除换行符导致`'-56\n'`无法匹配CSV中干净的`-56`、以及用`in`做子串匹配可能引发误匹配(如搜索`-6`会错误命中`-62`)。以下为优化后的完整解决方案:
import csv
# 步骤1:安全读取待搜索数字(自动过滤空行和换行符)
with open("numberstofind.txt", "r", encoding="utf-8") as f:
search_numbers = [line.strip() for line in f if line.strip()]
# 步骤2:对每个数字,在CSV中逐行逐单元格精准匹配
for idx, target in enumerate(search_numbers, start=1):
found = False
with open("midvalues1.csv", "r", encoding="utf-8") as csv_file:
reader = csv.reader(csv_file)
for row in reader:
# 在当前行的每个单元格中检查是否完全等于target(避免子串误匹配)
if any(cell.strip() == target for cell in row):
matched_line = ",".join(row)
print(matched_line)
print(f"Found {target}!")
# 保存匹配行到独立文件
with open(f"ident{idx}.txt", "w", encoding="utf-8") as out_f:
out_f.write(matched_line)
found = True
break # 找到首个匹配即退出本数字的搜索(如需全部匹配,移除此行)
if not found:
print(f"Data '{target}' not found!")✅ 核心改进说明:
- ✅ 健壮读取:使用列表推导式 line.strip() 清理每行,并跳过空行,确保 search_numbers = ['-49', '-56', '-62'];
- ✅ 字段级精确匹配:cell.strip() == target 确保只匹配完整字段(如-56不会匹配-560或156),比 target in line 或 re.search(target, line) 更安全;
- ✅ 资源友好:每个数字单独打开CSV文件(逻辑清晰),并使用 with 自动关闭;
- ✅ 编码安全:显式指定 encoding="utf-8" 避免中文或特殊字符报错;
- ✅ 可扩展设计:enumerate(..., start=1) 自然生成 ident1.txt、ident2.txt 等文件名。
⚠️ 注意事项:
- 若CSV含引号、逗号嵌套等复杂格式,请确保 csv.reader() 默认参数适用;如有需要,可传入 delimiter=';' 或 quotechar='"' 调整;
- 如需查找所有匹配行(不止第一个),请删除 break 语句;
- 若数字在CSV中带前导/尾随空格(如" -56 "),cell.strip() == target 仍能鲁棒匹配;
- 生产环境建议添加 try...except FileNotFoundError 包裹文件操作,提升容错性。
该方案结构清晰、逻辑内聚、易于维护,是处理“多关键词跨文件精准检索”任务的推荐实践。
立即学习“Python免费学习笔记(深入)”;











