1

我正在使用 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)

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

4

2 回答 2

0

您在上面列出了几个问题。你卡在哪一个?您似乎已经知道如何使用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通过将路径附加到子目录来更新父目录的保存。这有任何意义吗?

于 2016-11-01T04:33:45.900 回答
0

以下内容应该可以帮助您。它使用该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
于 2016-11-01T08:43:51.807 回答