You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析

  1. 路径转义错误:Windows路径中的\会被Python解析为转义字符(比如\J会被识别为特殊字符),导致路径无法正确识别,移到C盘后仍可能因转义问题导致程序无响应。
  2. 文件写入模式错误:使用'w'模式每次循环都会清空结果文件,最终只会保留最后一条记录,无法保存所有检查结果。
  3. 文件名匹配逻辑错误:
    • any(value in file for file in files)是检查值是否为文件名的子串,但files.index(value)要求值与文件名完全匹配,当值只是文件名的一部分时,index会直接报错。
    • 在else分支中,值不存在于任何文件名中,files.index(value)自然会抛出ValueError。
  4. 结果格式问题:原代码用\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:20:55