2017-01-30 2 views
1

У меня есть папка с несколькими входными файлами, которые можно использовать для визуализации D3. Но мне не удается заставить код регулярного выражения работать с glob. Это позволяет пользователю указать года (Примечание: все мои входные файлы форматирования YYYY_MM_ # produpdt ###):Как использовать регулярное выражение с библиотекой glob

from glob import glob 

years = "[\'2016\']" 
months = "[\'12\']" 
loc = "produpdt_files/" 
file_list = [] 
for year in years: 
    file_list.extend(glob(loc+year+"*")) 
print file_list 

Как я должен закодировать это работать с годами и месяцами? Ниже не работает:

from glob import glob 

years = "[\'2016\']" 
months = "[\'12\']" 
loc = "produpdt_files/" 
file_list = [] 
for year in years: 
    for month in months: 
     print(loc+year+"_12"+"*") 
     file_list.extend(glob(loc+year+"_"+month+"*")) 
print file_list 
+0

В качестве примечания стороны, 'years' является строкой. Когда вы перебираете строку («год за годами»), вы получаете по одному символу за раз. Я предполагаю, что вы на самом деле не хотите этого делать. Тот же комментарий относится к вашей петле над «месяцами». – FMc

+0

Спасибо! Это имеет смысл с тем, что я вижу. – lasingallday

+0

Каковы эти хэши в именах файлов, номерах? – tdelaney

ответ

0

выражение, которое вы хотите кормить в Glob является os.path.join(loc, "2016_12_*")

+0

Есть ли способ использовать переменные «год» и «месяц» в этом выражении? Я просто пробовал os.path.join (loc, year + "_ 12_ *"), и это не удалось. – lasingallday

+0

'os.path.join (loc, year +" 12 * ")' и 'os.path.join (loc," 2016_12 _ * ")' не эквивалентны. 'year +" 12 * "' оценивает (с 'year = 2016') до' 201612 * '. Обратите внимание, что это не имеет подчеркивания между годом и месяцем. Питонический способ создания строк - использовать строковые форматы, поэтому 'os.path.join (loc," {year} _ {month} _ * ". Format (year = 2016, month = 12))' именно то, что вы хотите. – Terrence

+0

Спасибо Терренсу за питоновский способ создания строк! И у меня возникли проблемы с получением символов подчеркивания в StackOverflow - я, вероятно, должен добавить escape-символ. – lasingallday

0

glob не принимает регулярные выражения, так что вам нужно, чтобы написать свой собственный globber. Но это легко сделать с os.listdir. Вы можете использовать группы в регулярном выражении для поиска нескольких дат, таких как r"(2012|2013|2014)_(10|11)_\dproduptd\d{4}". В приведенном ниже примере форматируется регулярное выражение, использующее списки лет и месяцев.

import os 
import re 

def produpdt_glob(path, years=None, months=None): 
    if years is None: 
     years = r'\d' * 4 
    if months is None: 
     months = r'[01]\d' 
    regex = r'({})_({})_\dprodupdt\d{4}'.format('|'.join(years), '|'.join(months)) 
    match = re.compile(regex).match 
    for fn in os.listdir(path): 
     if match(fn): 
      fn = os.path.join(path, fn) 
      if os.path.isfile(fn): 
       yield fn 
Смежные вопросы