在UNIX中查找文件的真实路径

时间:2018-08-23 18:01:02

标签: python python-3.x pathlib

我有以下代码,预计将执行以下操作,

  • 提供目录名(dirName)和前缀作为该函数的输入。
  • 从提供的输入目录(dirName)向下列出所有内容,然后使用os.walk函数开始在子目录中填充文件详细信息。
  • 找到文件后,将根据特定的前缀对其进行检查并进行进一步处理。
  • 这样做的动机是,一旦确定了文件(满足前缀),我就希望该文件的绝对真实路径。我尝试使用Path(libfile).resolve()选项,但是它仅给出运行脚本的当前工作目录,而不是该文件的真实路径。你能解释我哪里出问题了吗?

    import os
    from pathlib import Path
    
    def directory(dirName, prefix):
    
    process_dir = [name for name in os.listdir(dirName) if os.path.isdir(os.path.join(dirName, name))]
    for entry in process_dir:
        for dirname, directory, files in os.walk(os.path.join(dirName, entry)):
            for libfile in files:
                if libfile.startswith((prefix)):
                    return(Path(libfile).resolve())
    

Python版本3.6.2

2 个答案:

答案 0 :(得分:2)

几个问题:

1)您只返回一个文件

2)您仅使用文件名来调用.resolve,因此解析路径的位置取决于当前的工作目录。

3)您的规范指出,您只想在目录树中下降一级,但没有修剪os.walk所采用的下降路径。

我建议放弃os.walk,并充分使用Path

您声明只希望从上一层向下下载文件;这意味着您需要使用Path来达到更高的水平:

file_names=[]
for d in (p for p in Path(dirName).glob('*') if p.is_dir()):
    ab_path=d.resolve()
    file_names+=[fn for fn in Path(ab_path).iterdir() if fn.is_file() and fn.name.startswith(prefix)]

return file_names

还可以构造一个球形图案,以进一步简化该图案。可能很简单:

Path(dirName).glob('*/prefix*')

或者,

[p.resolve() for p in Path(dirName).glob('*/prefix*') if p.is_file()]

在一个目录下找到您想要的前缀的文件。

答案 1 :(得分:1)

更改此行:

return(Path(libfile).resolve())

对此:

return (Path(dirname) / libfile).resolve()

我同意the comment from dawg的观点,在这里使用递归glob模式将是更好的选择。