如何提取两个目录中的同名文件?代码执行异常求助
我来帮你排查下代码里的问题,你遇到的输出全是“not meet”,是因为好几处逻辑和用法错误导致的,咱们一步步修正:
问题拆解
os.listdir不支持通配符匹配:你想用listdir筛选*Not_Null.txt文件,但os.listdir只能列出目录下所有文件,无法做通配符过滤,得用glob.glob来实现这个需求。- 文件路径的转义陷阱:Python里字符串的反斜杠是转义符(比如
\U会被识别为Unicode转义),所以路径要改成原始字符串(加r前缀)或者用双反斜杠,避免解析错误。 - 文件读取的逻辑错误:你只是打开了
repo_dataset文件,但没有读取其中的内容;而且直接用生成器(str(l) for l in repo_dataset)和x比较,这永远不会相等——生成器是一个迭代器对象,不是具体的文件名字符串。另外,文件里的每行大概率带有换行符\n,需要先去掉才能正确匹配。 - 效率问题:如果把repo里的文件名存成集合,查找速度会从O(n)变成O(1),比每次循环遍历整个文件高效得多。
修正后的代码
import os import glob # 用原始字符串避免转义问题,用glob匹配指定后缀的文件 result = glob.glob(r"C:\Users\Dbs_finalFINAL\*Not_Null.txt") # 读取repo文件里的所有文件名,存成集合(自动去重+快速查找) with open(r"C:\Users\repositories_No_zero_datasets.txt", "r") as repo_file: # 去掉每行的换行符和空白,同时过滤空行 repo_names = {line.strip() for line in repo_file if line.strip()} # 遍历找到的Not_Null.txt文件,提取核心名称 for file_path in result: # 先从完整路径里提取文件名(比如"xxxNot_Null.txt") file_name = os.path.basename(file_path) # 去掉末尾的"Not_Null.txt"(长度为13) x = file_name[:-13] # 检查是否在repo的文件名集合里 if x in repo_names: print(f"找到同名文件: {x}") # 如果不需要打印未匹配项,可以注释掉下面的代码 # else: # print(f"未匹配: {x}")
关键改进说明
- 用
glob.glob正确匹配带通配符的文件,返回的是完整路径,所以用os.path.basename提取纯文件名。 - 用
with语句打开文件,会自动关闭文件,比手动close()更安全规范。 - 把repo里的文件名存成集合,既可以自动去重,又能实现极速查找。
- 处理了路径转义和换行符问题,避免了隐形的匹配失败。
内容的提问来源于stack exchange,提问作者nina_dev
相关产品推荐
相关产品推荐

