Python:使用 Try 和 except 来确定文件路径是否存在

问题描述 投票:0回答:1

我有一个脚本,可以递归地搜索源代码以查找该代码中的模块,以便能够获取所有必需的文件。

我正在使用一个在某种程度上可预测的文件结构,因此我可以做出“最佳猜测”以获得这个新模块的正确路径。此文件路径有一些例外,因此它可能并不总是会产生正确的结果。

我尝试使用 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", ...]

它工作得不错,但并不完美。有时代码不会引发异常,然后模块数组中会保留不正确的路径。我该如何改进这段代码?

python file recursion try-catch
1个回答
0
投票

可能需要更多解释。为什么要等待异常?我假设您期望 FileNotFoundError 异常,这是一个很好的做法,只捕获您想要处理的异常。否则可能会发生与 FileNotFound 无关的另一个异常您可能可以使用 os 模块

os.path.exists()
来检查路径是否存在。 导致错误的另一个问题可能是您在循环列表的同时修改列表。因此,当您从列表中删除一个元素时,索引会更新,因此现在您当前的元素现在是下一个元素,因此在 for 循环的下一次迭代中(删除元素后),您实际上会跳过一个元素,因为列表已更新。我建议您创建一个包含有效路径的新列表,而不是从正在循环的列表中删除。

© www.soinside.com 2019 - 2024. All rights reserved.