1

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

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

4

2 回答 2

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

使用您寻找的前缀在一个目录下查找文件。

于 2018-08-23T19:02:29.310 回答
1

更改此行:

return(Path(libfile).resolve())

对此:

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

我同意dawg 的评论,即在这里使用递归 glob 模式将是一个更好的选择。

于 2018-08-23T18:15:26.833 回答