Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf8
- import os
- import sys
- import re
- class MyException(Exception):
- pass
- # Текущие недостатки функции correct_mask:
- # 1. Используются символы допустимые в файловой системе Linux, это |*?
- def correct_mask(mask):
- # if re.search(r'[\\/:"<>]', mask) is not None: # Windows
- if re.search(r'[/]', mask) is not None: # Linux
- raise MyException('Запрещённые символы') # Не ищет при запретных символах в маске
- if mask.find('**'):
- mask = re.sub(r'\*+', '*', mask, 0) # Удаляет повторы *
- if re.search(r'[\s|.]\|', mask + '|') is not None:
- mask = re.sub(r'[\s|.]+\|', '|', mask + '|', 0) # Удаляет пробелы перед разделителями
- # print mask
- mask2 = '|' + mask + '|'
- # print mask2
- if mask2.find('|*|') != -1:
- return '*'
- if mask == '|':
- raise MyException('Ошибка при попытке исправить маску') # ошибка
- mask = mask.strip('|')
- # __mask_unique(mask)
- return mask
- # Текущие недостатки функции:
- # 1. Используются символы допустимые в файловой системе Linux, это |*?
- def file_search(path, mask='*', include=True , full=1):
- if mask == ',': # если ошибка маски
- # raise MyException(1) # Код ошибки
- raise MyException('ошибка маски')
- if not os.path.exists(path): # если путь не существует
- # raise MyException(2) # Код ошибки
- raise MyException('путь не существует')
- if not path.endswith(r'/'): # если на конце пути нет /
- path += r'/'
- # if mask == '*' or mask = '':
- # file_search_all(path, mask)
- # else:
- # file_search_mask(path, mask)
- file_list = ''
- for root, dirs, files in os.walk(path): # пройти по директории рекурсивно
- # print root
- for name in files:
- file_list += root + '|' + name + '\n' # Добавляем к списку. Разделитель ускоряет рег.выр.
- # listfile += name + '\n' # Добавляем к списку
- # mask = re.sub(r'[][$^.{}()+]', r'\\\0', mask, 0) # Экранируем спец-символы в маске
- mask = re.sub(r'([][$^.{}()+])', r'\\\1', mask, 0) # Экранируем спец-символы в маске
- mask = mask.replace('?', '.') # Заменяем метасимвол маски на метасимвол рег. выр.
- mask = mask.replace('*', '.*?') # Заменяем метасимвол маски на метасимвол рег. выр.
- # print mask
- rgex = 'i'
- if include:
- # Изменить разделитель | на управляющий символ
- a_file_list = re.findall(r'(?m' + rgex + r')^([^|]+\|(?:' + mask + r'))(?:\n|\z)', file_list) # Найти в соответствии с маской
- file_list = ''
- for i in a_file_list:
- file_list += i + '\n'
- else:
- file_list = re.sub(r'(?m' + rgex + r')^[^|]+\|(' + mask + r')\n', '', file_list + '\n', 0) # Найти и удалить в соответствии с маской
- file_list = file_list.replace('|', '/') # Удаляем разделитель
- # file_list = file_list.replace('|', '') # Удаляем разделитель
- if full == 0:
- file_list = re.sub(r'(?m)^[^\n]{' + str(len(path)) + '}', '', file_list, 0) # Удалить начало пути поиска. Относительный путь
- elif full == 2:
- file_list = re.sub(r'(?m)^.*/', '', file_list, 0) # Удалить до /, оставив только имена файлов с раширением
- elif full == 3:
- file_list = re.sub(r'(?m)^[^\n]+/', '', file_list, 0) # Удалить путь
- file_list = re.sub(r'(?m)\.[^./\n]+$', '', file_list, 0) # Удалить расширение
- file_list = file_list.rstrip('\n')
- return file_list
- # ==> конец file_search
- # ____________________ Тест функции ____________________
- path = '/usr'
- # path = os.path.expanduser('~') # Домашний каталог
- # path = os.path.realpath(os.path.dirname(sys.argv[0])) # Возвращает путь к каталогу запущенного скрипта
- # path = path + '/222' # проверка с несуществующим каталогом
- # path = path + '/22' # проверка с пустым каталогом
- # path = path + '/34' # проверка с каталогом со спец набором файлов
- # path = os.path.normpath(path + '/..') # Нормализация пути. Берём папку уровнем выше
- # print path
- try:
- # listfile = file_search(path, '*.txt', False) # False - кроме txt
- listfile = file_search(path, '*.py', True, 0)
- except MyException as e:
- print e.message
- exit()
- # listfile = '|' + listfile + '|'
- # print listfile
- # if listfile is None:
- # exit()
- # Сохранение результатов в файл
- f = open('я_testfile_write.txt', 'wb') # Открывает файл для записи
- f.write(listfile) # Записывает данные в файл
- f.close() # Закрывает дескриптор файла
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement