2015-10-14 2 views
0

Я ищу для фильтрации файлов в каталоге, а затем назначить часть этого filename (значение, которое я пытаюсь сопоставить изменениям) с переменной. Структура filename соответствует следующему примеру. *test file on part-of-filename-of-interest.csv. Последняя часть filename - это часть, которую я хотел бы добавить к переменной. Так что это всегда будет последняя часть имени файла и после слова on.Чтение имени файла и применение части этого имени к переменной

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

for root, dirs, files in os.walk('dirpath'): 
    filters = '*test file on*.csv' 
    for filename in fnmatch.filter(files, filters): 
     print filename #I get all the files im interested in but I dont know how to capture the relevant part of the filename to place it in a variable 
+0

Вы уверены, что вам нужен вложенный цикл? [Пример в документации] (https://docs.python.org/2/library/fnmatch.html) этого не делает. – TigerhawkT3

+0

Thats, потому что пример не имеет нескольких dirs, чтобы пройти;). Независимо от вложенного цикла, проблема заключается в том, чтобы получить частичное имя файла для переменной. Не для того, чтобы скомпилировать файлы. – iNoob

+0

Я смог составить рабочий фильтр, основанный на ответе digitaLink. – iNoob

ответ

1

Попробуйте использовать выражения регулярных выражений в соответствии с требуемой деталью.

import re 
p = re.compile("(?<=on).+") 
filename = "*test file on part-of-filename-of-interest.csv" 
new_filename = p.search(filename).group(0) 

Если вы не хотите, .csv включено изменить выражение регулярного выражения для этого:

p = re.compile("(?<=on).+(?=.csv)") 

Это хороший пример опережающего просмотра и просмотра назад.

+0

, который почти работает, однако он также печатает слово 'on'. – iNoob

+0

Это отлично работает 'p.search (filename) .group (0) .replace ('on', '')' – iNoob

+0

Ради полноты вы можете добавить вышеуказанный код комментария к своему ответу и плохо принять – iNoob

1

В зависимости от последовательности вашего рисунка, будет ли это работать на вас?

>>> fn = 'test file on part-of-filename-of-interest.csv' 
>>> import os 
>>> os.path.splitext(fn[fn.find('test file on') + 13:])[0] 
'part-of-filename-of-interest' 
+0

К сожалению, длина части интереса меняется – iNoob

+0

Спасибо за ответ BlivetWidget. – iNoob

+1

@iNoob Как это несчастливо? Вышеупомянутая функция не заботится о том, сколько времени представляет интерес. – BlivetWidget

1

Если нет никакого способа, чтобы получить доступ, что вы ищете с fnmatch, самым простым и быстрым решением является, вероятно, строковым методом:

print filename.partition('on')[2] 
Смежные вопросы