gpt4 book ai didi

python - 避免递归树中的基本路径

转载 作者:行者123 更新时间:2023-12-03 16:32:08 24 4
gpt4 key购买 nike

我知道如何递归列出 d:\temp 的所有文件/文件夹使用各种方法,参见 How to use glob() to find files recursively? .
但我经常想避免使用 d:\temp\结果中的前缀,并改为具有到此基的相对路径。
这可以通过以下方式完成:

  • import os, glob
    for f in glob.glob('d:\\temp\\**\\*', recursive=True):
    print(os.path.relpath(f, 'd:\\temp'))
  • 同上 f.lstrip('d:\\temp\\')它删除了这个前缀
  • import pathlib
    root = pathlib.Path("d:\\temp")
    print([p.relative_to(root) for p in root.glob("**/*")])

  • 这3个解决方案有效。但实际上如果你阅读了 glob.py的来源,它确实积累/加入了路径的所有部分。所以上面的解决方案是......“删除之前刚刚添加的内容”!它有效,但不是很优雅。同上 pathlibrelative_to删除前缀。
    问题:如何修改后面几行没有d:\temp在输出中(不删除之前连接的东西!)?
    import os

    def listpath(path):
    for f in os.scandir(path):
    f2 = os.path.join(path, f)
    if os.path.isdir(f):
    yield f2
    yield from listpath(f2)
    else:
    yield f2

    for f in listpath('d:\\temp'):
    print(f)

    #d:\temp\New folder
    #d:\temp\New folder\New Text Document - Copy.txt
    #d:\temp\New folder\New Text Document.txt
    #d:\temp\New Text Document - Copy.txt
    #d:\temp\New Text Document.txt

    最佳答案

    您可以执行以下示例中所示的操作。基本上,我们递归地返回将它们连接在一起的路径部分,但我们不连接初始根。

    import os

    def listpath(root, parent=''):
    scan = os.path.join(root, parent)
    for f in os.scandir(scan):
    f2 = os.path.join(parent, f.name)
    yield f2
    if f.is_dir():
    yield from listpath(root, f2)

    for f in listpath('d:\\temp'):
    print(f)
    在尚未发布的 Python 3.10 中,将会有一个新的 root_dir 选项,这将允许您使用内置的 glob 毫无问题地执行此操作:
    import glob
    glob.glob('**/*', root_dir='d:\\temp', recursive=True)
    您也可以使用第三方库,例如 wcmatch已经实现了这种行为的库(我是它的作者)。但在这个简单的情况下,您的 listpath方法可能就足够了。

    关于python - 避免递归树中的基本路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65134774/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com