#python #regex #python-2.7
#python #регулярное выражение #python-2.7
Вопрос:
Я прочитал документацию по регулярным выражениям, но это очень сбивает с толку начинающего программиста вроде меня. Итак, мое последнее средство — опубликовать здесь.
# Tivo Notifier
import os, re
WATCH_DIR = "D:/tivo"
TO_FIND = [".*big.brother.uk.s15.*", ".*mock.the.week.*", ".*family.guy.*"]
# open history log file
history = open("history.txt", "w ")
# get downloaded files
files = os.listdir(WATCH_DIR)
# compare each file to regex patterns
for pattern in TO_FIND:
regex = re.compile(pattern)
match = [m.group(0) for file in files for m in [regex.search(file)] if m]
for filename in match:
if filename not in history.read(): # if a new match is found
print "new:", filename # display new match file name
history.write(filename) # add file name to history file
history.close()
Проблема здесь в том, что он записывает тонну мусора в файл истории:
http://pastebin.com/3C5iVbU7
Я предполагаю, что это потому filename
, что это не строка, а, вероятно, своего рода объект регулярных выражений. Я не вижу в документации, как вернуть строку.
Я хотел бы добавить только имя файла в файл истории, а не текст мусора, который фактически добавляется из этого скрипта.
Может кто-нибудь сказать мне, как это сделать?
Комментарии:
1. Я не думаю
history.read()
, что возвращает список, он возвращает одну строку. Такfilename not in history.read()
не сработает. Вам нужноhistory.read().split('n')
.2. Кроме того, чтение всего файла истории каждый раз через цикл очень неэффективно. Прочитайте это один раз в начале.
3. Вам нужно написать новую строку после каждого имени файла в файле истории.
Ответ №1:
Вот более простой способ, который использует glob
вместо регулярных выражений. Он также использует наборы для ведения истории и новых файлов.
import os, glob
WATCH_DIR = 'D:/tivo'
TO_FIND = ['*big.brother.uk.s15*', '*mock.the.week*', '*family.guy*']
history = set(open('history.txt').read().splitlines())
new_files = set()
for pattern in TO_FIND:
files = glob.glob(os.path.join(WATCH_DIR, pattern))
# optionally strip directories from file names
files = [os.path.basename(f) for f in files]
new_files.update(files)
new_files = new_files.difference(history)
for f in sorted(new_files):
print "new: %s" % f
history.update(new_files)
open('history.txt', 'w').write('%sn' % 'n'.join(sorted(history)))