MyTetra Share
Делитесь знаниями!
Программа "Сортировщик файлов"
Время создания: 29.07.2019 23:51
Текстовые метки: python примеры, sortfiles
Раздел: Разные закладки - Python - Перевод документации Python 3.x
Запись: xintrea/mytetra_db_adgaver_new/master/base/1515942087o4x00ejzz4/text.html на raw.githubusercontent.com

Программа "Сортировщик файлов"

Язык программирования Python можно использовать для сортировки файлов по разным признакам. На нем можно написать что-то вроде утилит find и grep.

Что такое сортировка файлов? Допустим, у нас есть каталог с кучей разных файлов. Требуется файлы с определенными признаками переместить в один каталог, а с другими — в другой. Также файлы можно не перемещать из каталога, а копировать или удалять.

В любом случае работа программы логично делится на две части — это 1) составление списка файлов, удовлетворяющих определенному признаку, и 2) выполнение действий над этими файлами.

Файлы можно искать по многим признакам. В программе ниже реализован поиск по имени (шаблону), размеру (с указанием диапазона или по признаку больше-меньше определенного значения) и времени (создания, открытия, изменения).

Возможные действия над файлами в программе — это копирование, перемещение и удаление.

В программе "Сортировщик файлов" организован текстовый интерфейс взаимодействия с пользователем. Пользователь указывает каталог, признак, по которому осуществляется поиск, и действие над найденными файлами.

Части программы оформлены в виде функций.

import os # for functions: walk, path.join, remove, path.getsize, path.get[cam]time, mkdir

import fnmatch # fnmatch

import shutil # copy, move

import datetime # datetime.fromtimestamp

 

# копирование или перемещение, проверка на наличие уже существующего файла или каталога

def func_copymove(whatdo,l,dp):

newdir = input('Имя каталога: ')

newdir = os.path.join(dp,newdir)

while os.path.isdir(newdir): # пока вводится имя существующего каталога

print('Такой каталог уже есть!')

newdir = input('Имя каталога: ')

newdir = os.path.join(dp,newdir)

os.mkdir(newdir)

index = 0

for i in l:

future_file = i.split('/')

future_file2 = future_file[-1].split('\\')

future_file = future_file[0:-1] + future_file2

if not os.path.isfile(newdir+'/'+future_file[-1]):

if whatdo == 'c':

shutil.copy(i,newdir)

elif whatdo == 'm':

shutil.move(i,newdir)

else:

newdir2 = newdir + '/' + future_file[-2]

if not os.path.isdir(newdir2):

os.mkdir(newdir2) # каталог в каталоге

if whatdo == 'c':

shutil.copy(i,newdir2)

elif whatdo == 'm':

shutil.move(i,newdir2)

else:

if not os.path.isfile(newdir2+'/'+future_file[-1]):

if whatdo == 'c':

shutil.copy(i,newdir2)

elif whatdo == 'm':

shutil.move(i,newdir2)

else:

newdir2 = newdir + '/' + future_file[-2] + str(index)

index += 1

os.mkdir(newdir2)

if whatdo == 'c':

shutil.copy(i,newdir2)

elif whatdo == 'm':

shutil.move(i,newdir2)

 

# копирование, перемещение и удаление файлов

def func_whatdo(l,dp):

whatdo = input('Действие (c-копировать,m-переместить,r-удалить,\

0-ничего не делать): ')

if whatdo == 'c':

print('Каталог с копиями будет находиться в', dp)

func_copymove('c',l,dp)

elif whatdo == 'm':

print('Каталог для перемещаемых файлов будет находиться в', dp)

func_copymove('m',l,dp)

elif whatdo == 'r':

confirm = input('Запрашивать подтверждение на удаление каждого файла\

(y/n): ')

if confirm == 'n':

for i in l:

os.remove(i)

else:

for i in l:

yes_no = input('Удалить файл ' + i + ' (y/n): ')

if yes_no == 'y':

os.remove(i)

 

#поиск по шаблону

def func_pattern(dp,pat):

l = []

for r,d,f in os.walk(dp):

for i in f:

if fnmatch.fnmatch(i,pat):

l.append(os.path.join(r,i))

qty = len(l)

print('Найдено',qty,'файлов')

if qty > 0:

func_whatdo(l,dp)

 

#поиск по размеру

def func_size(dp,ml,s):

l = []

for r,d,f in os.walk(dp):

for i in f:

filepath = os.path.join(r,i)

filesize = (os.path.getsize(filepath)) // 1024

if ml == '<' and filesize < s:

l.append(filepath)

elif ml == '>' and filesize > s:

l.append(filepath)

qty = len(l)

print('Найдено',qty,'файла(ов)')

if qty > 0:

func_whatdo(l,dp)

 

#поиск по диапазону размеров

def func_size2(dp,lsize,usize):

l = []

for r,d,f in os.walk(dp):

for i in f:

filepath = os.path.join(r,i)

filesize = (os.path.getsize(filepath)) // 1024

if lsize <= filesize <= usize:

l.append(filepath)

qty = len(l)

print('Найдено',qty,'файлов')

if qty > 0:

func_whatdo(l,dp)

 

#поиск по времени (три функции ниже)

def func_datetransform(datestring): # преобразование даты-строки в список чисел

datelist = datestring.split('.')

j = 0

for i in datelist:

datelist[j] = int(i)

j += 1

return datelist

 

def quantitydays(datelist): # подсчет количества дней от начала года

month = [31,28,31,30,31,30,31,31,30,31,30,31]

qdays = 0

i = 1

while i < datelist[1]:

qdays = qdays + month[i-1]

i += 1

qdays = qdays + datelist[0]

return qdays

 

def func_time(dp,fdate,sdate,typetime):

l = []

date1 = func_datetransform(fdate)

date2 = func_datetransform(sdate)

for r,d,f in os.walk(dp):

for i in f:

filepath = os.path.join(r,i)

if typetime == 'c':

time = os.path.getctime(filepath)

elif typetime == 'a':

time = os.path.getatime(filepath)

elif typetime == 'm':

time = os.path.getmtime(filepath)

time = datetime.datetime.fromtimestamp(time)

time = time.timetuple()

datefile = []

datefile.append(time[2])

datefile.append(time[1])

datefile.append(time[0])

if date1[2] < datefile[2] < date2[2]:

l.append(filepath)

elif date1[2] == datefile[2] and date2[2] == datefile[2]:

days1 = quantitydays(date1)

days2 = quantitydays(date2)

days = quantitydays(datefile)

if days1 <= days <= days2:

l.append(filepath)

elif date1[2] == datefile[2] and datefile[2] < date2[2]:

days1 = quantitydays(date1)

days = quantitydays(datefile)

if days1 <= days:

l.append(filepath)

elif date1[2] < datefile[2] and datefile[2] == date2[2]:

days2 = quantitydays(date2)

days = quantitydays(datefile)

if days <= days2:

l.append(filepath)

qty = len(l)

print('Найдено',qty,'файла(ов)')

if qty > 0:

func_whatdo(l,dp)

 

#ИНТЕРФЕЙС

dirpath = input('Путь к каталогу | The path: ')

while not os.path.exists(dirpath) and not os.path.isdir(dirpath): #проверка пути

print('Такого каталога нет | There is no this directory')

dirpath = input('Путь к каталогу | The path: ')

 

option = input('Параметр сортировки (1-шаблон,2-размер,3-диапазон,4-время)\

| Search option (1-pattern,2-size,3-range,4-time): ')

 

print("Для отказа введите 'n'!")

if option == '1':

pattern = input('Шаблон имени файла | Template for filename: ')

while pattern != 'n':

func_pattern(dirpath,pattern)

pattern = input('Шаблон имени файла | Template for filename: ')

elif option == '2':

moreless = input('Меньше или больше определенного размера (<-меньше,>-больше)\

| Less or more then a certain size (<-less,>-more): ')

size = int(input('Размер (в Кб) | The size (Kb): '))

func_size(dirpath,moreless,size)

elif option == '3':

minsize = int(input('Нижняя граница размера (в Кб)\

| The lower limit of the size (Kb): '))

maxsize = int(input('Верхняя граница размера (в Кб)\

| The upper limit of the size (Kb): '))

func_size2(dirpath,minsize,maxsize)

elif option == '4':

fromdate = input('Начиная с даты | From the date of: ')

enddate = input('Заканчивая датой | Ending the date: ')

kinddate = input('Поиск по времени создания(c), открытия(a), изменения(m)\

| Search by time of create(c), open(a), change(m): ')

func_time(dirpath,fromdate,enddate,kinddate)

 

 

 

На нем можно написать что-то вроде утилит find и grep.

 
MyTetra Share v.0.65
Яндекс индекс цитирования