【问题标题】:recursive searching with pathlib - python使用 pathlib 进行递归搜索 - python
【发布时间】:2020-01-09 20:10:54
【问题描述】:

假设我有这些文件

/home/user/one/two/abc.txt
/home/user/one/three/def.txt
/home/user/one/four/ghi.txt

我正在尝试使用pathlib 模块递归查找ghi.txt。我试过了:

p = '/home/user/'
f = Path(p).rglob(*i.txt)

但我获得文件名的唯一方法是使用列表推导:

file = [str(i) for i in f]

实际上只工作一次。重新运行上面的命令会返回一个空列表。

我决定学习pathlib,因为显然这是社区推荐的,但不是:

file = glob.glob(os.path.join(p,'**/*i.txt'),recursive=True) 

更直接?

【问题讨论】:

  • 显然您已经找到了两种方法来解决您喜欢的问题。你有什么问题?
  • 它只能工作一次,大概是因为rglob() 返回了一个生成器,它会被你的理解力耗尽。 f = tuple(Path(p).rglob(*i.txt)) 会让你循环多次,如果你出于某种原因需要这样做

标签: python glob pathlib


【解决方案1】:

您已经有了解决方案。

不确定我是否正确阅读了要求,但我已经发布了带有以下假设的答案。

  • PathListPrefix 是您要搜索的起始路径 全部文件。在您的情况下,它可能是 '/home/user'
  • FileName 是您要查找的文件的名称。在您的情况下,它是“ghi.txt”
  • 您预计不会超过一场比赛。
  • 必须尝试除 pathlib 模块之外的其他方法。

就直接解决方案而言,我也不确定。但是下面的解决方案是我可以想到的使用 os 模块。

import os
PathListPrefix = '/home/user/'
FileName = 'ghi.txt'

def Search(StartingPath, FileNameToSearch):
    root, ext = os.path.splitext(StartingPath)
    FileName = os.path.split(root)[1]
    if FileName+ext == FileNameToSearch:
        return True
    return False

for root, dirs, files in os.walk(PathListPrefix):
    Path = root
    for eachfile in files:
        SearchPath = os.path.join(Path,eachfile)
        Found = Search(SearchPath, FileName)
        if Found:
            print(Path, FileName)
            break

代码的行数肯定比你的多得多。所以它不像你的那么紧凑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 2012-01-30
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多