Python - 浏览符合命名标准的子目录
Python - Navigating through Subdirectories that Meet Naming Criteria
我正在使用 Python 3.5 来分析 csv 文件中包含的数据。这些文件包含在一个 "figs" 目录中,该目录包含在一个案例目录中,该目录包含在一个整体数据目录中,例如:
/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 文件中包含的数据填充现有数组。
基本上,我的问题涉及浏览多个符合特定命名约定的子目录,并最终访问 "end." 处的数据文件,我天真地玩弄了 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)
我遇到过相关问题,但我无法以我想要的方式应用他们的答案,尤其是嵌套目录。非常感谢您的帮助,如果我需要澄清任何事情,请告诉我。
您在上面列出了几个问题。你卡在哪一个?您似乎已经知道如何使用 os.path
浏览文件存储系统。您可能不知道 os.path.join()
函数,它允许您手动指定相对于文件的文件路径:
os.path.abspath(os.path.join(os.path.dirname(__file__), '../..', 'Data/TrailShelters/'))
分解以上内容:
os.path.dirname(__file__)
returns 当前文件的路径。 '../..'
表示:在文件夹层次结构中上升两级。 Data/TrailShelters/
是我希望导航到的目录。
这如何适用于您的具体情况?好吧,您需要进行一些调整,但您可以将父目录的 os.path
存储在一个变量中。然后你基本上可以使用 while sub_dir is not null
循环来遍历子目录。对于每个子目录,您需要检查它的 os.path
并提取您感兴趣的路径的特定部分。然后您可以简单地使用类似: if 'TN' in subdirectory_name
来确定它是否是您感兴趣的子目录在。 如果是的话;然后通过将路径附加到子目录来更新父目录的已保存 os.path
。这有意义吗?
以下内容应该可以帮助您前进。它使用 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
我正在使用 Python 3.5 来分析 csv 文件中包含的数据。这些文件包含在一个 "figs" 目录中,该目录包含在一个案例目录中,该目录包含在一个整体数据目录中,例如:
/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 文件中包含的数据填充现有数组。
基本上,我的问题涉及浏览多个符合特定命名约定的子目录,并最终访问 "end." 处的数据文件,我天真地玩弄了 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)
我遇到过相关问题,但我无法以我想要的方式应用他们的答案,尤其是嵌套目录。非常感谢您的帮助,如果我需要澄清任何事情,请告诉我。
您在上面列出了几个问题。你卡在哪一个?您似乎已经知道如何使用 os.path
浏览文件存储系统。您可能不知道 os.path.join()
函数,它允许您手动指定相对于文件的文件路径:
os.path.abspath(os.path.join(os.path.dirname(__file__), '../..', 'Data/TrailShelters/'))
分解以上内容:
os.path.dirname(__file__)
returns 当前文件的路径。 '../..'
表示:在文件夹层次结构中上升两级。 Data/TrailShelters/
是我希望导航到的目录。
这如何适用于您的具体情况?好吧,您需要进行一些调整,但您可以将父目录的 os.path
存储在一个变量中。然后你基本上可以使用 while sub_dir is not null
循环来遍历子目录。对于每个子目录,您需要检查它的 os.path
并提取您感兴趣的路径的特定部分。然后您可以简单地使用类似: if 'TN' in subdirectory_name
来确定它是否是您感兴趣的子目录在。 如果是的话;然后通过将路径附加到子目录来更新父目录的已保存 os.path
。这有意义吗?
以下内容应该可以帮助您前进。它使用 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