【问题标题】:Finding particular path in directory in Python在 Python 中查找目录中的特定路径
【发布时间】:2017-04-22 00:06:07
【问题描述】:

如何找到包含 20170423 之类的日期的目录的路径?意思是,它可以是任何日期,但我想拥有那个特定的路径,直到我得到一个包含日期的文件夹。沿途可能有几个包含该模式的子目录,但这是一种特殊情况,我需要提供更高的精度,例如选择正确的文件夹的内容。如果您想针对特殊情况试一试,但对于我知道沿途只有一个文件夹包含该模式的情况,我开始的方式是:

 directPaths_list  =  [f.path for f in os.scandir( start ) if f.is_dir()   ] 

这给了我从开始文件夹到结束的所有路径。现在,我想返回其中包含日期模式的路径,特别是一个,让我们说谁的 int(folder_name) 是

我可以想出一个粗略的解决方案,但是 SO 有非常好的技能的人想出简洁优雅的解决方案,所以它是.. 有什么想法吗?谢谢!

例如,对于路径 start= C:/,这将返回 C:\Users\abc\def\ghi\20170412

我在想这样的事情是否可行:

[f.path for f in os.scandir('C:\\Users\\abc\\def\\ghi\\') if f.is_dir() and str(f.path).endswith(str(2),-2,-1) ] 

【问题讨论】:

    标签: python path subdirectory os.system scandir


    【解决方案1】:

    假设日期20170423 是一个相应命名的文件。 然后你可以使用os.walk():

    start = "C:\\Users\\abc\\"
    
    for dirpath, dirnames, filenames in os.walk(start):
        for filename in filenames:
            if filename == "20170412":
                filename = os.path.join(dirpath, filename)
                print(filename)
                print(dirpath)
    

    如果只有一个文件存在C:\Users\abc\def\ghi\20170412,那么上面会输出:

    C:\Users\abc\def\ghi\20170412
    C:\Users\abc\def\ghi\
    

    您当然可以更改 if 语句以适合您是否要检查 filename.startswith("2017") 或其他任何内容。

    警告:如果您执行start = "C:\\",那么这很可能需要很长时间才能完成。因为它会遍历C盘。

    您同样可以更改for filename in filenames

    for dirname in dirnames:
        if dirname == "20170412":
            dirname = os.path.join(dirpath, dirname )
            print(dirname)
            print(dirpath)
    

    因此如果C:\Users\abc\def\ghi\20170412实际上是一个目录,那么上面的输出会和之前一样:

    C:\Users\abc\def\ghi\20170412
    C:\Users\abc\def\ghi\
    

    我希望有更简洁的东西

    如果这就是你所说的更简短的话,你仍然可以将它打包到列表理解中。

    files = [os.path.join(dir, f) for dir, dirs, files in os.walk(start) for f in files if f == "20170412"]
    

    【讨论】:

    • 谢谢!但我想要一个目录,我应该只使用for dirname in dirnamesdirname<datetime.datetime.today() 的解决方案吗?
    • 是的,您同样可以使用for dirname in dirnames。找到文件或目录后,父目录将为dirpath
    • 不错!,如果我从 C:\\ 开始,我实际上可以使用 os.walk("C:\\Users\...", topdown=False) 进行自下而上搜索
    • 是的,你确实可以。但是,如果从 C:\ 开始,仍然需要很长时间。
    • 我已经称它非常简洁了。但是,如果这是您想要的,您仍然可以进行列表理解(将其添加到答案中)。我真的不知道您所说的“不易出错”是什么意思。如果这是你想要的,你总是可以创建一个函数find_files_by_name(start, name)
    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 2020-12-06
    • 2014-04-23
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多