【问题标题】:Finding the realpath of a file in unix在 unix 中查找文件的真实路径
【发布时间】:2026-02-25 17:50:02
【问题描述】:

我有以下代码,预计会做以下事情,

  • 提供目录名称 (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。

【问题讨论】:

  • 我使用的是python 3.6.2
  • 看一下libfile 的值,应该立即明白为什么python 找不到它的绝对路径。这是一个文件名。您的文件系统上可能有 500 万个具有该名称的文件。 python 应该如何知道你的意思是哪一个?
  • 是的 libfile 是一个文件名,我想要它的完整真实路径。我的理解是Path函数应该能够解析python中文件的真实路径
  • @wim,什么是 MCVE?
  • 那么,文件名foo.txt的真实路径是什么?

标签: python python-3.x pathlib


【解决方案1】:

几个问题:

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()]

用您寻找的前缀找到下一个目录的文件。

【讨论】:

    【解决方案2】:

    改变这一行:

    return(Path(libfile).resolve())
    

    到这里:

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

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

    【讨论】:

    • 非常感谢所有 cmets/建议和帮助。它解决了我的问题。出于好奇,任何人都可以列出 dawg 建议的 glob 解决方案吗?