Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2021, 12:19   #1
Антон Облёзин
Пользователь
 
Регистрация: 02.02.2021
Сообщений: 13
По умолчанию Сортировщик фалов по папкам

Чтобы облегчить себе работу, написал макрос на pithon 2.6.6

Задача:
В одной директории:
- Имеются файлы (чертежей);
- Имеются папки (изделий).

Файлы нужно поместить в соответсвующие папки,
- Сортировка производится по наибольшему совпадению символов в наименованиях файлов и папок от начала;
- Если в целевой папке имелся файл с таким - же наименованием, то он заменяется на перемещаемый;
- Если число папок с максимальным совпадением символов больше 1, то копирование не производится.
- Если число совпадений символов меньше трёх, то копирование также не производится.

(для лучшего понимания кода, оставил закомментированные print'ы и комментарии к функциям)
Код:
# -*- coding: utf-8 -*-
# Блок получения файлов в текущей директории
import os # Подключить модуль "ОС"
import inspect # Подключить модуль "inspect"
import sys # Подключить модуль "sys"

directory = os.getcwd() # Выясняет текущую директорию
Spisok_folder = [ item for item in os.listdir(directory) if os.path.isdir(os.path.join(directory, item)) ] # Создаёт список папок
Count_folder = len(Spisok_folder) # Возвращает количество папок в исходной директории

# Создаёт список файлов
from os import listdir
from os.path import isfile, join
Spisok_files= [f for f in listdir(directory) if isfile(join(directory, f))]

Full_name = inspect.stack()[0][1]
name = os.path.basename(Full_name)

a = ""
g = " "
for b in Spisok_files:

    a = a + b
print a

Spisok_files.remove(name) # Удаляет из списка аргумент с конкретным именем
Count_files = len(Spisok_files) # Возвращает количество файлов в исходной директории
print "-------------------------------------------------------------------------------- "
print " "

# Начало основной части

Number_file = 1
Number_folder = 1
Number_symbol_file = 0
Number_symbol_folder = 0
Spisok_sovpadenii=[]
Count_sovpadenii=0

print " "
#Current_file = " ".join(Spisok_files[Number_file-1:Number_file])
#Current_symbol_file = Current_file[Number_symbol_file-1:Number_symbol_file]
#Current_file_count = len (Current_file)
#print Current_symbol_file
#print Current_file
#print Current_file_count

#Current_folder = " ".join(Spisok_folder[Number_folder-1:Number_folder])
#Current_symbol_folder = Current_folder[Number_symbol_folder-1:Number_symbol_folder]
#Current_folder_count = len (Current_folder)

# Циклы


for c in range (Count_files): #Цикл, сменяющий наименование файлов
    Current_file = " ".join(Spisok_files[Number_file-1:Number_file])
    #Current_symbol_file = Current_file[Number_symbol_file-1:Number_symbol_file]
    Current_file_count = len (Current_file)
    
    
    for b in range(Count_folder): # Цикл, сменяющий наименование папок
        Current_folder = " ".join(Spisok_folder[Number_folder-1:Number_folder])
        flag=0
	# Определение количества сравнений для цикла
        Current_file_count = len (Current_file)
        Current_folder_count = len (Current_folder)
        #print Current_file_count
        #print Current_folder_count
        if Current_file_count >= Current_folder_count:
            Count_for = Current_folder_count
        else:
            Count_for = Current_file_count

        for a in range(Count_for): # Цикл, сверяющий совпадающие символы
            Current_symbol_folder=Current_folder[Number_symbol_folder]
            Current_symbol_file=Current_file[Number_symbol_file]

            #print u'Текущий файл:',Current_file
            #print u'Текущая папка:',Current_folder
            #print u'Номер символа файла:',Number_symbol_file
            #print u'Номер символа папки:',Number_symbol_folder
            #print u'Текущий символ папки:',Current_symbol_folder
            #print u'Текущий символ файла:',Current_symbol_file


            if Current_symbol_file==Current_symbol_folder:
                if flag==0:
                    Count_sovpadenii=Count_sovpadenii+1
                    #print u"Да"
            else:
                flag=1
                #print u"Нет"

            #print flag
            Number_symbol_file=Number_symbol_file+1
            Number_symbol_folder=Number_symbol_folder+1
            
            #print u'Символ файла:',Current_file[Number_symbol_file]
            #print u'Символ папки:',Current_folder[Number_symbol_folder]
        
        
        Number_symbol_file=0
        Number_symbol_folder=0
        Spisok_sovpadenii.append(Count_sovpadenii) # Добавление в список переменной
        Count_sovpadenii=0
        Number_folder=Number_folder+1
        

    Count_sovpadenii_max=max(Spisok_sovpadenii, key=lambda i: int(i)) # Нахожд. макс. числа совпадений в списке
    Count_max_sovpadenii=Spisok_sovpadenii.count(Count_sovpadenii_max) # Нахожд. повтор. макс. велич. совпад. симв.
    Number_folder_max_sovpadenii=Spisok_sovpadenii.index(Count_sovpadenii_max) # Нахожд. 1 поз. из списка с макс. совпад.
    Folder_max_sovpadenii = "".join(Spisok_folder[Number_folder_max_sovpadenii]) # Нахожд. имени поз. из списка.

    if Count_max_sovpadenii==1:
        if Count_sovpadenii_max>= 3: #Пропускной балл для количества совпадений
            print u"Копирование..."
            print u'Текущий файл:',Current_file
            print u'Файл в папке:',os.path.isfile(Folder_max_sovpadenii +"\\"+ Current_file)
            if os.path.isfile(Folder_max_sovpadenii +"\\"+ Current_file) == True:
                print u'Получилось'
                os.remove(Folder_max_sovpadenii +"\\"+ Current_file) # Удаление копии файла в найденной директории
            os.rename(Current_file, Folder_max_sovpadenii +"\\"+ Current_file) # Ключевое действие


##    print u'Текущий файл:',Current_file
##    print u'Список папок:',Spisok_folder
##    print u'Список совпадений символов:', Spisok_sovpadenii
##    print u'Число максимального совпадения символов:', Count_sovpadenii_max
##    print u'Количество максимальных совпадений символов:', Count_max_sovpadenii
##    print u'Первая позиция из списка с максимальным совпадением символов:',Number_folder_max_sovpadenii
##    print u'Наименование первой позиции из списка с максимальным совпадением символов:',Folder_max_sovpadenii

    Spisok_sovpadenii=[]
    Number_folder=1
    Number_file=Number_file+1
В работе сортировщика обнаружен такой недостаток:

Файлы с именами: DP-1250-2-50-Р Втулка ходовая (Ремонт); DP-1250-2-51 Шайба,
Были закинуты в папку с именем: DP-1250-2-52-Р Втулка в сборе.
Это произошло потому, что алгоритм производит посимвольное сравнение, и нашёл максимальное совпадение в тексте: "DP-1250-2-5". Исключение – бы составило наличие папки, например, DP-1250-2-53.

Решение:

Можно, в каждых подобных местах создавать «блокирующие» папки, например, «DP-1250-2-5», чтобы копирования не происходило.
Вложения
Тип файла: doc Сортировщик одноуровневый.doc (6.5 Кб, 1 просмотров)
Антон Облёзин вне форума Ответить с цитированием
Старый 09.04.2021, 13:07   #2
Антон Облёзин
Пользователь
 
Регистрация: 02.02.2021
Сообщений: 13
По умолчанию Вторая версия сортировщика

Развивая тему, я разработал многоуровневый сортировщик.
В отличие от предыдущего варианта, он перемещает файл дальше по директориям, пока имеется условие его перемещения. За тем, возвращается к исходной директории, и переходит к следующему файлу.

Сортировщик так - же не лишён вышеуказанного недостатка. Если у кого - ни будь есть соображения, как его исправить, пишите в ответах.
Вложения
Тип файла: doc Многоуровневый сортировщик.doc (12.4 Кб, 1 просмотров)
Антон Облёзин вне форума Ответить с цитированием
Старый 09.04.2021, 14:38   #3
Антон Облёзин
Пользователь
 
Регистрация: 02.02.2021
Сообщений: 13
По умолчанию Третья версия сортировщика

Третья версия представляет собой одноуровневый сортировщик с другой логикой сравнения наименований.
Логика заключается в том, что идёт сравнение символов в любых местах наименований файлов и папок.
Более подробно - сначала сравниваются первые символы. За тем, с первым символом файла сравнивается второй символ папки, и далее, до конца наименования файла. При первом совпадении символов, сравниваются последующие символы. При прекращении совпадения, алгоритм сравнения возвращается к исходному. Количество совпадений формируется в список, из которого находится максимальное число.

Код:
# -*- coding: utf-8 -*-
# Блок получения файлов в текущей директории
import os # Подключить модуль "ОС"
import inspect # Подключить модуль "inspect"
import sys # Подключить модуль "sys"

directory = os.getcwd() # Выясняет текущую директорию
Spisok_folder = [ item for item in os.listdir(directory) if os.path.isdir(os.path.join(directory, item)) ] # Создаёт список папок
Count_folder = len(Spisok_folder) # Возвращает количество папок в исходной директории

# Создаёт список файлов
from os import listdir
from os.path import isfile, join
Spisok_files= [f for f in listdir(directory) if isfile(join(directory, f))]

Full_name = inspect.stack()[0][1]
name = os.path.basename(Full_name)

a = ""
g = " "
for b in Spisok_files:

    a = a + b
#print a

Spisok_files.remove(name) # Удаляет из списка аргумент с конкретным именем
Count_files = len(Spisok_files) # Возвращает количество файлов в исходной директории
#print "-------------------------------------------------------------------------------- "
#print " "

# Начало основной части

Number_file = 1
Number_folder = 1
Number_symbol_file = 0
Number_symbol_folder = 0
Spisok_sovpadenii=[]
Count_sovpadenii=0

#print " "
#Current_file = " ".join(Spisok_files[Number_file-1:Number_file])
#Current_symbol_file = Current_file[Number_symbol_file-1:Number_symbol_file]
#Current_file_count = len (Current_file)
##print Current_symbol_file
##print Current_file
##print Current_file_count

#Current_folder = " ".join(Spisok_folder[Number_folder-1:Number_folder])
#Current_symbol_folder = Current_folder[Number_symbol_folder-1:Number_symbol_folder]
#Current_folder_count = len (Current_folder)

# Циклы


for c in range (Count_files): #Цикл, сменяющий наименование файлов
    Current_file = " ".join(Spisok_files[Number_file-1:Number_file])
    #Current_symbol_file = Current_file[Number_symbol_file-1:Number_symbol_file]
    Current_file_count = len (Current_file)
    
    
    for b in range(Count_folder): # Цикл, сменяющий наименование папок
        Current_folder = " ".join(Spisok_folder[Number_folder-1:Number_folder])

        Count_sovpadenii_simv=0
        Spisok_sovpadenii_simv=[]

                
	# Определение количества сравнений для цикла
        Current_file_count = len (Current_file)
        Current_folder_count = len (Current_folder)
        ##print Current_file_count
        ##print Current_folder_count

        #print u'Текущий файл:',Current_file
        #print u'Текущая папка:',Current_folder
        while Number_symbol_file < Current_file_count:
            #print u'Символ файла:',Current_file[Number_symbol_file]
            #print u'Символ папки:',Current_folder[Number_symbol_folder]
            Current_symbol_folder=Current_folder[Number_symbol_folder]
            Current_symbol_file=Current_file[Number_symbol_file]

                
            ##print u'Текущий файл:',Current_file
            ##print u'Текущая папка:',Current_folder
            ##print u'Номер символа файла:',Number_symbol_file
            ##print u'Номер символа папки:',Number_symbol_folder
            ##print u'Текущий символ папки:',Current_symbol_folder
            ##print u'Текущий символ файла:',Current_symbol_file


            if Current_symbol_file==Current_symbol_folder:
                #print u'Да'
                Count_sovpadenii_simv+=1
                Number_symbol_file+=1
                Number_symbol_folder+=1
                if Number_symbol_folder>Current_folder_count-1:
                    Spisok_sovpadenii_simv.append(Count_sovpadenii_simv)
                    break
                    ##print u"Да"
            else:
                #print u'Нет'
                Spisok_sovpadenii_simv.append(Count_sovpadenii_simv)
                Count_sovpadenii_simv=0
                    ##print u"Нет"
                Number_symbol_folder+=1
                if Number_symbol_folder>=Current_folder_count:
                    Number_symbol_folder=0
                    Number_symbol_file+=1

        #print u'Число совпадений символов', Count_sovpadenii_simv
        #print u'Список совпадений символов', Spisok_sovpadenii_simv
       
            ##print flag
            
            
        
        Count_sovpadenii=max(Spisok_sovpadenii_simv, key=lambda i: int(i))
        Number_symbol_file=0
        Number_symbol_folder=0
        Spisok_sovpadenii.append(Count_sovpadenii) # Добавление в список переменной
        Count_sovpadenii=0
        Number_folder=Number_folder+1
        

    Count_sovpadenii_max=max(Spisok_sovpadenii, key=lambda i: int(i)) # Нахожд. макс. числа совпадений в списке
    #print u'Число совпадений', Count_sovpadenii_max
    Count_max_sovpadenii=Spisok_sovpadenii.count(Count_sovpadenii_max) # Нахожд. повтор. макс. велич. совпад. симв.
    Number_folder_max_sovpadenii=Spisok_sovpadenii.index(Count_sovpadenii_max) # Нахожд. 1 поз. из списка с макс. совпад.
    Folder_max_sovpadenii = "".join(Spisok_folder[Number_folder_max_sovpadenii]) # Нахожд. имени поз. из списка.

    if Count_max_sovpadenii==1:
        if Count_sovpadenii_max>= 3: #Пропускной балл для количества совпадений
            #print u"Копирование..."
            #print u'Текущий файл:',Current_file
            #print u'Файл в папке:',os.path.isfile(Folder_max_sovpadenii +"\\"+ Current_file)
            if os.path.isfile(Folder_max_sovpadenii +"\\"+ Current_file) == True:
                #print u'Получилось'
                os.remove(Folder_max_sovpadenii +"\\"+ Current_file) # Удаление копии файла в найденной директории
            os.rename(Current_file, Folder_max_sovpadenii +"\\"+ Current_file) # Ключевое действие


##    #print u'Текущий файл:',Current_file
##    #print u'Список папок:',Spisok_folder
##    #print u'Список совпадений символов:', Spisok_sovpadenii
##    #print u'Число максимального совпадения символов:', Count_sovpadenii_max
##    #print u'Количество максимальных совпадений символов:', Count_max_sovpadenii
##    #print u'Первая позиция из списка с максимальным совпадением символов:',Number_folder_max_sovpadenii
##    #print u'Наименование первой позиции из списка с максимальным совпадением символов:',Folder_max_sovpadenii

    Spisok_sovpadenii=[]
    Number_folder=1
    Number_file=Number_file+1
Но, выявлена следующая несовершенность:
Файл с наименованием «DP-1250-6-1-Р Суппорт поворотный (ремонт)»
Был закинут в папку «DP-1250-5 Суппорт поперечный +»,
потому, как он обнаружил максимальное совпадение в подстроке « Суппорт по».
Вложения
Тип файла: doc Сортировщик 3.doc (7.3 Кб, 0 просмотров)
Антон Облёзин вне форума Ответить с цитированием
Старый 09.04.2021, 15:51   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

У меня возник вопрос.
А чё, нельзя разработать стандарт именования файлов в таких разработках?
Например:
Изделие - код. Детали первого уровня - Код изделия + код детали. И т.д.
Пусть это будет первая часть имени. За этой частью следуют поясняющие слова.

Но это взгляд профана.
За перемещение файлов отвечает нормировщик, который контролирует соответствие именования стандарту и даёт добро на перемещение.
Возможно, что это упростит сортировщик и сделает такую операцию более надёжной.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 09.04.2021, 16:03   #5
Антон Облёзин
Пользователь
 
Регистрация: 02.02.2021
Сообщений: 13
По умолчанию

ViktorR, Я так и делаю, именую детали по типу: "Шифр изделия - шифр сборочной единицы - шифр детали (пробел) наименование детали".
А про нормировщик, не понял. Это человек, или программа?
Антон Облёзин вне форума Ответить с цитированием
Старый 09.04.2021, 17:58   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
"Шифр изделия - шифр сборочной единицы - шифр детали (пробел)
ну так искать папку ДО ПЕРВОГО пробела.
Шифр изделия - шифр сборочной единицы - шифр детали (пробел)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.04.2021, 20:35   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Цитата:
А про нормировщик, не понял. Это человек, или программа?
У кого как. В принципе - это человек, как правило один из сотрудников, который в конце рабочего дня подводит итог.
Цитата:
"Шифр изделия - шифр сборочной единицы - шифр детали (пробел) наименование детали"
А нафига пробел? Ну да в Windows - это нормально.
Но ..., можно использовать символ нижнего подчёркивания, тире или "верблюжью" запись.
Цитата:
Я так и делаю, именую детали по типу:
Но тогда зачем:
Цитата:
Логика заключается в том, что идёт сравнение символов в любых местах наименований файлов и папок.
Более подробно - сначала сравниваются первые символы. За тем, с первым символом файла сравнивается второй символ папки, и далее, до конца наименования файла. При первом совпадении символов, сравниваются последующие символы.
Есть строка содержащая имя папки, есть подстрока, содержащая часть имени файла, та часть, которая стандартизована. Сравниваем эти строки обычным образом:
Код:
if sNameFolder == sNameFile:
    <бла-бла-бла>
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.04.2021, 08:59   #8
Антон Облёзин
Пользователь
 
Регистрация: 02.02.2021
Сообщений: 13
По умолчанию

ViktorR,
1. У нас на предприятии три разрозненных конструктора. В общую папку чертежи мы не сдаём.
2. Пробелом я отделяю вариант (исполнение) детали. Это бывает не часто. Например, есть вариант детали нового изготовления (ставлю "Н"), или отремонтированная (ставлю "Р"). И то, если деталь разрабатывается в двух и более исполнениях. Наименование файла соответствует шифру чертежа с его наименованием через пробел.
3. Дело в том, что изначально неизвестно количество папок и файлов в директории, и их наименования. Ваше условие подразумевает полное совпадение имён, а такого, в моём случае, быть не может. Ведь у меня директории представляют собой сборочную иерархию.
Антон Облёзин вне форума Ответить с цитированием
Старый 12.04.2021, 09:13   #9
Антон Облёзин
Пользователь
 
Регистрация: 02.02.2021
Сообщений: 13
По умолчанию

evg_m,
Спасибо большое.
Шифр изделия, тире (разделитель), шифр ДСЕ и т.д. Выделять подстроки между разделителями, и сравнивать их по условию полного совпадения. Это позволит избежать ошибок сортировки.
Надо как-нибудь и такой сортировщик запилить.
Антон Облёзин вне форума Ответить с цитированием
Старый 19.04.2021, 12:32   #10
Антон Облёзин
Пользователь
 
Регистрация: 02.02.2021
Сообщений: 13
По умолчанию Четвёртая версия сортировщика


Это - четвёртая версия сортировщика. Она предназначена специально для работы с шифрами документации. Автор идеи evg_m. Сортировщик одноуровневый (возможно, пока).

Принцип работы лежит в сортировке файлов по папкам поблочно, т.е., когда в наименованиях находятся разделители, символы " " или "-", то блоки, ограниченные разделителями (или, между начальными, или конечными разделителями), сравниваются между собой на предмет полного совпадения. Файл попадает в папку с наибольшим числом совпадений блоков в обоих наименованиях. Если наименование файла не имеет указанных разделителей, то сортировка идёт по посимвольному принципу (вариант сортировки прошлых версий).
Вложения
Тип файла: doc Сортировщик 4.doc (11.7 Кб, 0 просмотров)

Последний раз редактировалось Антон Облёзин; 19.04.2021 в 12:35.
Антон Облёзин вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пузырьковый сортировщик массива fiver29 Python 3 04.06.2019 23:02
Deiphi 7 ,сортировщик Karfi Помощь студентам 1 01.04.2016 13:20
многопоточный сортировщик метод слияние gagarin614 Помощь студентам 1 21.09.2012 09:23
ПЕРЕСТАЕТ РАБОТАТЬ СОРТИРОВЩИК Cone Microsoft Office Excel 5 10.08.2010 16:36
Сортировщик медиа-файлов нужен. dim3740 Фриланс 3 30.03.2010 17:29