Как я могу подтвердить и удалить исходные файлы после их сортировки и копирования в несколько папок? - PullRequest
2 голосов
/ 06 августа 2020

Я новичок ie и стараюсь сделать офисную работу менее утомительной. В настоящее время у меня есть небольшая программа, которая сортирует и копирует файлы .pdf из папки в несколько папок, в зависимости от того, кому эти файлы нужно отправить позже.

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

Теперь я пытался выяснить, могу ли я заставить программу сравнивать список файлов в исходной папке со списком файлов из всех других папок назначения, а затем удалите оригиналы, если файлы действительно скопированы. сравните.

Вот мой код:

import os
import shutil
import pathlib
import pprint





dir = ('[path to original folder]')

files = os.listdir(dir)

user_data = [
    ('Karl H. Preusse', [Path to Karl]),
    ('Rom', [Path to Rom]),
    ('Hochschule', [Path to Hochschule]),
    ('Kiefer', [Path to Kiefer),
    ('Penny', [Path to Penny),
    ('Steigenberger', [Path to Steigenberger]),
    ('Penzkofer', [Path to Penzkofer]),
    ('Stoffel', [Path to Stoffel]),
    ('Cavertitzer', [Path to Cavertitzer])
]

for pattern, dest_dir in user_data:
    matching_files = [f for f in files if pattern in f]
    for filename in matching_files:
        full_filename = os.path.join(dir, filename)
        if os.path.isfile(full_filename):
            if not os.path.exists(dest_dir):
                os.makedirs(dest_dir)
            shutil.copy(full_filename, dest_dir)
            pprint.pprint(shutil.copy(full_filename, dest_dir))


stetje_datotek = sum(len(files) for _, _, files in os.walk([Path to directory that holds the copy folders])) #defines files to count
print('Stevilo datotek v mapi Posiljanje je: {}' .format(stetje_datotek)) #Prints out how many files are in the target folders.

Ниже приведены мои попытки автоматизировать работу.

#I commented this function out as I couldn't figure out how to get the data out of it.

#def sub_files(folder):
#    relpath = os.path.relpath
 #   join = os.path.join
  #  for path, _, files in os.walk([Path to directory that holds the copy folders]):
   #     relative = relpath(path, [Path to directory that holds the copy folders])
    #    for file in files:
     #       yield join(relative, file)

#print(sub_files)

Здесь я решил использовать входные данные для индивидуальной проверки каждой папки :

#print(os.listdir([Path to directory that holds the copy folders]))
#if input() == 'Penzkofer':
    #pprint.pprint(os.listdir([Path to Penzkofer folder]))

И здесь я попытался сравнить списки, но получил ошибку TypeError: unhashable type: 'list'

prvotne_datoteke = set(os.listdir(dir))
kopirane_datoteke = set(os.walk([Path to directory that holds the copy folders])
set(prvotne_datoteke).intersection(kopirane_datoteke)

Любая помощь приветствуется. Спасибо.

1 Ответ

1 голос
/ 06 августа 2020

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

to_be_copied = set() # holds original paths of all files being copied 

for pattern, dest_dir in user_data:
    matching_files = [f for f in files if pattern in f]
    for filename in matching_files:
        full_filename = os.path.join(dir, filename)
        to_be_copied.add(filename) # adds filepaths 
        if os.path.isfile(full_filename):
            if not os.path.exists(dest_dir):
                os.makedirs(dest_dir)
            shutil.copy(full_filename, dest_dir)
            pprint.pprint(shutil.copy(full_filename, dest_dir))

# Iterates through copied files
for original_file in to_be_copied:
    count = 0
    recipients = []
    
    # Iterates through potential recipients
    for pattern, dest_dir in user_data:
        complete_name = os.path.join(dest_dir, original_file)
        if os.path.isfile(complete_name):
            count += 1
            recipients.append(pattern)
    
    print(original_file + ' sent to ' + str(count) + ' people:')
    print(recipients)
    
    # Quick manual check, could be changed to checking if count/recipients is correct
    print('Delete original file? (Y or N): ')
    delete = input()
    if (delete == 'Y'):
        os.remove(os.path.join(dir, original_file))
        

        
...