2016-11-01 21 views
0

Я использую Python 3.5 для анализа данных, содержащихся в файлах csv. Эти файлы содержатся в «инжир» каталог, который содержится в каталоге случае, который содержится в общем каталоге данных, например:Python - Перемещение по подкаталогам, которые соответствуют критериям именования

/strm1/Serino/DATA/06052009/инжир

Или в более общем плане:

/strm1/Serino/DATA/case_date_in_MMDDYYYY/инжир

Каталог, в котором я начинаю: '/ strm1/serino/DATA /,', и каждый подкаталог - это месяц, день и год, в котором я работаю. Каждый подкаталог содержит другой подкаталог с именем «figs», и это местоположение файла csv каждого случая. Чтобы быть точным:

/strm1/Serino/DATA/case_date_in_MMDDYYYY/инжир/case_date_in_MMDDYYYY .csv

Итак, я хотел бы начать в моей директории DATA и пройти через его подкаталогов для поиска тех, у кого есть MMDDYYYY. Однако некоторые каталоги case могут быть названы с сокращением состояния в конце, например: '06052009_TX.' Поэтому, вместо того, чтобы точно именовать MMDDYYYY, это может быть что-то простое, как проверка того, что имя каталога содержит любое число от 1 до 9.

Как только я попал в первый подкаталог (каталог case), я хотел бы переместить в подкаталог «figs». После этого я хочу получить доступ к файлу csv с тем же самым соглашением об именах, что и первый подкаталог (каталог case). Я буду заполнять существующие массивы данными, содержащимися в каждом файле 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) 

Я встречал связанные с ней вопросы, но я не смог применить свои ответы так, как я хотел бы, особенно с вложенными каталогами. Я очень ценю помощь, и дайте мне знать, если мне нужно что-то разъяснить.

ответ

0

Следующее должно вас поймать. Он использует функцию datetime.strptime(), чтобы попытаться преобразовать имя каждой папки в действительный объект datetime. Если преобразование завершается неудачно, вы знаете, что имя папки не в правильном формате и может быть пропущено. Затем он пытается проанализировать любой CSV-файл, найденный в соответствующей папке fig:

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 
+0

Это именно то, с чем мне нужна помощь, и это имеет смысл. Я не понимал, что вы можете использовать 'datetime.strptime' таким образом. Я также не знал о «попытке». Большое вам спасибо, и я извиняюсь, что мне потребовалось некоторое время, чтобы ответить. – ChelleS

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 родительского каталога, добавив путь к подкаталогу. Имеет ли это смысл?

+0

Большое вам спасибо за ваш ответ. Ответ, приведенный @ Мартином Эвансом ниже, более подробно затрагивает мой вопрос. Я извиняюсь за любую путаницу, но прохождение по каталогам было тем, что я застрял. Однако вы правы в том, что я не знал о 'os.path.join()' и что мне нужно было использовать это в моем коде. Я ценю ваш быстрый ответ. – ChelleS