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

2024-10-06 07:13:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码,它将执行以下操作

  • 提供目录名(dirName)和前缀作为函数的输入。你知道吗
  • 列出从提供的输入目录(dirName)向下一级列出的所有内容,并开始使用os.步行功能。你知道吗
  • 一旦找到这些文件,它们将根据特定的前缀进行检查并进一步处理。你知道吗
  • 动机是一旦一个文件被识别(满足一个前缀),我想要那个文件的绝对realpath。我试着使用Path(libfile).resolve()选项,但它只给出当前的工作目录,脚本是从那里运行的,而不是该文件的realpath。你能解释一下我错在哪里吗?你知道吗

    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。你知道吗


Tags: 文件pathnameinimport目录forprefix
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

还可以构造一个glob模式来进一步简化它。这可能很简单:

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

或者

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

找到一个目录下的文件与前缀你寻找。你知道吗

更改此行:

return(Path(libfile).resolve())

对此:

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

我同意the comment from dawg,在这里使用递归glob模式将是一个更好的选择。你知道吗

相关问题 更多 >