【问题标题】:Python - Navigating through Subdirectories that Meet Naming CriteriaPython - 浏览符合命名标准的子目录
【发布时间】:2016-11-01 04:13:50
【问题描述】:

我正在使用 Python 3.5 来分析 csv 文件中包含的数据。这些文件包含在“figs”目录中,该目录包含在 case 目录中,该目录包含在整个数据目录中,例如:

/strm1/serino/DATA/06052009/figs

或更笼统地说:

/strm1/serino/DATA/case_date_in_MMDDYYYY/figs

我开始的目录是“/strm1/serino/DATA/”,每个子目录是我正在处理的案例的月、日和年。每个子目录都包含另一个名为“figs”的子目录,这是每个案例的 csv 文件的位置。准确地说:

/strm1/serino/DATA/case_date_in_MMDDYYYY/figs/case_date_in_MMDDYYYY.csv

所以,我想从我的 DATA 目录开始,并通过它的子目录查找具有 MMDDYYYY 命名的那些。但是,某些案例目录的名称可能在末尾带有州缩写,例如:“06052009_TX”。因此,与其完全匹配 MMDDYYYY 命名,不如验证目录名称是否包含任何数字 1 到 9 一样简单。

一旦我进入第一个子目录(案例目录),我想移动到“figs”子目录。在那里,我想使用与第一个子目录(案例目录)相同的命名约定来访问 csv 文件。我将使用每个 csv 文件中包含的数据填充现有数组。

基本上,我的问题涉及浏览多个匹配特定命名约定的子目录,并最终在“末尾”访问数据文件。我很天真地玩弄 glob、fnmatch、os.listdir 和 os.walk,但我找不到任何足够接近工作的东西,我认为将其包含在内会有所帮助。我对这些模块不是很熟悉。我可以包括的是我的目标:

    for dirs in data_dir that contain a number:
        go into this directory
        go into 'figs' directory
        read data from the csv file whose name matches its case directory name (or whose name format matches the case directory name format)

我遇到过相关问题,但我无法以我想要的方式应用他们的答案,尤其是对于嵌套目录。非常感谢您的帮助,如果我需要澄清任何事情,请告诉我。

【问题讨论】:

    标签: python csv datetime subdirectory python-os


    【解决方案1】:

    以下内容应该可以帮助您前进。它使用datetime.strptime() 函数尝试将每个文件夹名称转换为有效的datetime 对象。如果转换失败,那么您就知道文件夹名称的格式不正确,可以跳过。然后它会尝试解析在相应的fig 文件夹中找到的任何 CSV 文件:

    from datetime import datetime
    import glob
    import csv
    import os
    
    dirpath, dirnames, filenames = next(os.walk('/strm1/serino/DATA'))
    
    for dirname in dirnames:
        if len(dirname) >= 8:
            try:
                dt = datetime.strptime(dirname[:8], '%m%d%Y')
                print(dt, dirname)
                csv_folder = os.path.join(dirpath, dirname)
    
                for csv_file in glob.glob(os.path.join(csv_folder, 'figs', '*.csv')):
                    with open(csv_file, newline='') as f_input:
                        csv_input = csv.reader(f_input)
    
                        for row in csv_input:
                            print(row)
    
            except ValueError as e:
                pass
    

    【讨论】:

    • 这正是我需要帮助的地方,并且看到它是有道理的。我没有意识到您可以以这种方式使用datetime.strptime。我也不知道try。非常感谢,很抱歉我花了一段时间才回复。
    【解决方案2】:

    您在上面列出了几个问题。你卡在哪一个?您似乎已经知道如何使用os.path 导航文件存储系统。您可能不知道函数os.path.join(),它允许您手动指定相对于文件的文件路径:

    os.path.abspath(os.path.join(os.path.dirname(__file__), '../..', 'Data/TrailShelters/'))
    

    分解以上内容:

    os.path.dirname(__file__) 返回当前文件的路径。 '../..' 表示:在文件夹层次结构中上两层。 Data/TrailShelters/ 是我希望导航到的目录。

    这如何适用于您的具体案例?好吧,您需要进行一些调整,但您可以将父目录的os.path 存储在一个变量中。然后,您基本上可以使用while sub_dir is not null 循环来遍历子目录。对于每个子目录,您需要检查其os.path 并提取您感兴趣的路径的特定部分。然后您可以简单地使用类似:if 'TN' in subdirectory_name 来确定它是否是您感兴趣的子目录。如果是这样;然后通过将路径附加到子目录来更新父目录的保存os.path。这有意义吗?

    【讨论】:

    • 非常感谢您的回复。下面@Martin Evans 提供的答案更彻底地解决了我的问题。对于任何混淆,我深表歉意,但浏览目录是我一直坚持的。但是,您是正确的,因为我不知道 os.path.join() 并且我需要在我的代码中使用它。感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多