Advertisement
AZJIO

file_search

Sep 23rd, 2014
800
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.24 KB | None | 0 0
  1. # coding: utf8
  2.  
  3. import os
  4. import sys
  5. import re
  6.  
  7. class MyException(Exception):
  8.    pass
  9.  
  10. # Текущие недостатки функции correct_mask:
  11. # 1. Используются символы допустимые в файловой системе Linux, это |*?
  12.  
  13. def correct_mask(mask):
  14.     # if re.search(r'[\\/:"<>]', mask) is not None: # Windows
  15.     if re.search(r'[/]', mask) is not None: # Linux
  16.         raise MyException('Запрещённые символы') # Не ищет при запретных символах в маске
  17.     if mask.find('**'):
  18.         mask = re.sub(r'\*+', '*', mask, 0) # Удаляет повторы *
  19.     if re.search(r'[\s|.]\|', mask + '|') is not None:
  20.         mask = re.sub(r'[\s|.]+\|', '|', mask + '|', 0) # Удаляет пробелы перед разделителями
  21.     # print mask
  22.     mask2 = '|' + mask + '|'
  23.     # print mask2
  24.     if mask2.find('|*|') != -1:
  25.         return '*'
  26.     if mask == '|':
  27.         raise MyException('Ошибка при попытке исправить маску') # ошибка
  28.     mask = mask.strip('|')
  29.     # __mask_unique(mask)
  30.     return mask
  31.  
  32. # Текущие недостатки функции:
  33. # 1. Используются символы допустимые в файловой системе Linux, это |*?
  34.  
  35. def file_search(path, mask='*', include=True , full=1):
  36.     if mask == ',': # если ошибка маски
  37.         # raise MyException(1) # Код ошибки
  38.         raise MyException('ошибка маски')
  39.     if not os.path.exists(path): # если путь не существует
  40.         # raise MyException(2) # Код ошибки
  41.         raise MyException('путь не существует')
  42.     if not path.endswith(r'/'): # если на конце пути нет /
  43.         path += r'/'
  44.     # if mask == '*' or mask = '':
  45.         # file_search_all(path, mask)
  46.     # else:
  47.         # file_search_mask(path, mask)
  48.     file_list = ''
  49.     for root, dirs, files in os.walk(path): # пройти по директории рекурсивно
  50.         # print root
  51.         for name in files:
  52.             file_list += root + '|' + name + '\n' # Добавляем к списку.  Разделитель ускоряет рег.выр.
  53.             # listfile += name + '\n' # Добавляем к списку
  54.  
  55.     # mask = re.sub(r'[][$^.{}()+]', r'\\\0', mask, 0) # Экранируем спец-символы в маске
  56.     mask = re.sub(r'([][$^.{}()+])', r'\\\1', mask, 0) # Экранируем спец-символы в маске
  57.     mask = mask.replace('?', '.') # Заменяем метасимвол маски на метасимвол рег. выр.
  58.     mask = mask.replace('*', '.*?') # Заменяем метасимвол маски на метасимвол рег. выр.
  59.     # print mask
  60.  
  61.     rgex = 'i'
  62.     if include:
  63.         # Изменить разделитель | на управляющий символ
  64.         a_file_list = re.findall(r'(?m' + rgex + r')^([^|]+\|(?:' + mask + r'))(?:\n|\z)', file_list) # Найти в соответствии с маской
  65.         file_list = ''
  66.         for i in a_file_list:
  67.             file_list += i + '\n'
  68.     else:
  69.         file_list = re.sub(r'(?m' + rgex + r')^[^|]+\|(' + mask + r')\n', '', file_list + '\n', 0) # Найти и удалить в соответствии с маской
  70.  
  71.     file_list = file_list.replace('|', '/') # Удаляем разделитель
  72.     # file_list = file_list.replace('|', '') # Удаляем разделитель
  73.    
  74.     if full == 0:
  75.         file_list = re.sub(r'(?m)^[^\n]{' + str(len(path)) + '}', '', file_list, 0) # Удалить начало пути поиска. Относительный путь
  76.     elif full == 2:
  77.         file_list = re.sub(r'(?m)^.*/', '', file_list, 0) # Удалить до /, оставив только имена файлов с раширением
  78.     elif full == 3:
  79.         file_list = re.sub(r'(?m)^[^\n]+/', '', file_list, 0) # Удалить путь
  80.         file_list = re.sub(r'(?m)\.[^./\n]+$', '', file_list, 0) # Удалить расширение
  81.  
  82.     file_list = file_list.rstrip('\n')
  83.  
  84.     return file_list
  85. # ==>  конец file_search
  86.  
  87. # ____________________ Тест функции ____________________
  88.  
  89. path = '/usr'
  90. # path = os.path.expanduser('~') # Домашний каталог
  91. # path = os.path.realpath(os.path.dirname(sys.argv[0])) # Возвращает путь к каталогу запущенного скрипта
  92. # path = path + '/222' # проверка с несуществующим каталогом
  93. # path = path + '/22' # проверка с пустым каталогом
  94. # path = path + '/34' # проверка с каталогом со спец набором файлов
  95. # path = os.path.normpath(path + '/..') # Нормализация пути. Берём папку уровнем выше
  96. # print path
  97.  
  98.  
  99. try:
  100.     # listfile = file_search(path, '*.txt', False) # False - кроме txt
  101.     listfile = file_search(path, '*.py', True, 0)
  102. except MyException as e:
  103.     print e.message
  104.     exit()
  105.  
  106. # listfile = '|' + listfile + '|'
  107. # print listfile
  108. # if listfile is None:
  109.     # exit()
  110.    
  111.  
  112. # Сохранение результатов в файл
  113. f = open('я_testfile_write.txt', 'wb') # Открывает файл для записи
  114. f.write(listfile) # Записывает данные в файл
  115. f.close() # Закрывает дескриптор файла
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement