Python检查文件值存在性:结果写入失败及报错排查
问题说明
我在文件中存储了值列表,需要用Python读取该文件,检查这些值是否存在于指定文件夹的文件名中(注:原代码逻辑为检查文件名是否包含目标值),若不存在则记录信息以便导出为CSV处理缺失文件。目前已实现文件读取功能,但无法按预期写入结果文件;运行时出现ValueError报错,将文件夹移到C盘后程序无任何反应。
原代码
import os import re # Get the list of files in the directory files = os.listdir("W:\JA\JA's Coding Curiosity\Python\Test Folder\Test Files") # Create a list of values to check for with open("W:\JA\JA's Coding Curiosity\Python\Test Folder\Values.txt", 'r') as f: my_list = f.readlines() list_without_newline = [line.strip() for line in my_list] # Check if each value exists in any of the files for value in list_without_newline: if any(value in file for file in files): with open("W:\JA\JA's Coding Curiosity\Python\Test Folder\Results.txt",'w') as f: f.write("is\\T{}\\T{}\n".format(value, files[files.index(value)])) else: with open("W:\JA\JA's Coding Curiosity\Python\Test Folder\Results.txt",'w') as f: f.write("not\\T{}\\T{}\n".format(value, files[files.index(value)]))
报错信息
PS W:\JA\JA's Coding Curiosity\Python\Test Folder> python FileSearch.py Traceback (most recent call last): File "W:\JA\JA's Coding Curiosity\Python\Test Folder\FileSearch.py", line 19, in <module> f.write("not\\T{}\\T{}\n".format(value, files[files.index(value)])) ^^^^^^^^^^^^^^^^^^ ValueError: '12919031' is not in list
问题分析
- 路径转义错误:Windows路径中的
\会被Python解析为转义字符(比如\J会被识别为特殊字符),导致路径无法正确识别,移到C盘后仍可能因转义问题导致程序无响应。 - 文件写入模式错误:使用
'w'模式每次循环都会清空结果文件,最终只会保留最后一条记录,无法保存所有检查结果。 - 文件名匹配逻辑错误:
any(value in file for file in files)是检查值是否为文件名的子串,但files.index(value)要求值与文件名完全匹配,当值只是文件名的一部分时,index会直接报错。- 在
else分支中,值不存在于任何文件名中,files.index(value)自然会抛出ValueError。
- 结果格式问题:原代码用
\T作为分隔符,若要导出CSV应改用逗号或制表符\t,方便后续工具处理。
解决方案与修正代码
import os # 用原始字符串处理Windows路径,避免转义问题 target_dir = r"W:\JA\JA's Coding Curiosity\Python\Test Folder\Test Files" values_path = r"W:\JA\JA's Coding Curiosity\Python\Test Folder\Values.txt" result_path = r"W:\JA\JA's Coding Curiosity\Python\Test Folder\Results.csv" # 获取文件夹中的所有文件名 files = os.listdir(target_dir) # 读取待检查的值列表,过滤空行 with open(values_path, 'r', encoding='utf-8') as f: check_values = [line.strip() for line in f if line.strip()] # 打开结果文件,一次性写入所有结果 with open(result_path, 'w', encoding='utf-8') as result_file: # 写入CSV表头 result_file.write("状态,待检查值,匹配的文件名\n") for value in check_values: # 收集所有包含该值的文件名 matched_files = [file for file in files if value in file] if matched_files: # 多个匹配文件用分号分隔 matched_str = ';'.join(matched_files) result_file.write(f"存在,{value},{matched_str}\n") else: result_file.write(f"缺失,{value},\n")
关键修复点
- 用原始字符串(前缀
r)定义Windows路径,彻底解决转义问题。 - 在循环外打开结果文件,一次性写入所有检查结果,避免多次打开清空文件。
- 收集所有匹配的文件名,替代原代码中错误的
index查找逻辑,解决ValueError。 - 直接生成CSV格式文件(逗号分隔),无需后续转换即可用于处理缺失文件。
- 过滤值列表中的空行,避免无效检查。
内容的提问来源于stack exchange,提问作者Djaq Harris
相关产品推荐
相关产品推荐

