Python: 使用try和except判断文件路径是否存在

0 投票
1 回答
40 浏览
提问于 2025-04-14 16:32

我有一个脚本,它会递归地搜索源代码中的模块,以便找到所有需要的文件。

我正在处理的文件结构比较规律,所以我可以做一个“最佳猜测”,来找到这个新模块的正确路径。不过,这个文件路径有时候会有例外,所以不一定总是能找到正确的结果。

我尝试使用“尝试捕获”(try catch)来确认每个源文件中的模块,看看在这个路径下是否真的有文件。如果这个路径下没有文件,它会再试一次新的路径。如果模块还是找不到,就会把这个错误的路径从模块数组中删除,跳过它。

我想在递归完成后,打印出所有正确的文件路径,并标记出那些找不到的文件路径。

我的Python代码如下:

modules = ["../pathsource1.c", "../path/source2.c"]

for module in modules: 
   try:
      with open(module, 'r') as f: 
          for line in f: 
              # search each line for keyword to see if there is a file
              if(module_name):
                 modules.append(path_to_module + module_name) 
   except: 
       print("path did not lead to a module.") 
       try:
           with open(new_module_path, 'r') as f:
               print("module found!")
               modules.append(new_module_path)
       except:
           print("module not found at any location")
       modules.remove(module) # remove old path, which was broken

print(modules) # should return only paths that exist  

expected output:

["../path/source1.c", "../path/source2.c", "../path/module1_in_source1.c", "path/module2_in_source1.c", "../path/module1_in_module2_in_source1.c", ...]

这个代码运行得还不错,但并不完美。有时候代码没有抛出异常,导致错误的路径仍然留在模块数组里。我该如何改进这个代码呢?

1 个回答

0

你可能需要多解释一下。你为什么要等着捕捉异常呢?我猜你是想处理一个叫做 FileNotFoundError 的错误。一般来说,最好只捕捉你想处理的那个特定错误。否则,可能会出现其他和文件找不到无关的错误。

你可以使用操作系统模块中的 os.path.exists() 来检查一个路径是否存在。

导致你出错的另一个问题可能是你在遍历列表的同时还在修改它。也就是说,当你从列表中删除一个元素时,列表的索引会更新,这样你当前要处理的元素就变成了下一个元素。因此,在你删除元素后的下一次循环中,你实际上会跳过一个元素,因为列表已经被更新了。我建议你创建一个新的列表,里面放有效的路径,而不是在你正在遍历的那个列表中删除元素。

撰写回答