Переместить все файлы из дерева каталогов в другой каталог. Переименовать, если повторные имена - PullRequest
0 голосов
/ 04 апреля 2020

Мне нужно получить все файлы в данном дереве каталогов (папка с именем Temp и подкаталогами с большим количеством подкаталогов и файлов ...), зашифровать их и переместить все в уникальный каталог (папка с именем Temp2 без подкаталогов). Если есть повторяющиеся имена, я хочу изменить имя, скажем, text.txt -> text (1) .txt и продолжить перемещение этого переименованного файла.

Это то, что у меня есть в данный момент:

bufferSize = 64 * 1024
password1 = 'password'

print('\n> Beginning recursive encryption...\n\n')
for archivo in glob.glob(sourcePath + '\\**\*', recursive=True):
   fullPath = os.path.join(sourcePath, archivo)
   fullNewf = os.path.join(destinationPath, archivo + '.aes')

   if os.path.isfile(fullPath):
      print('>>> Original: \t' + fullPath + '')
      print('>>> Encrypted: \t' + fullNewf + '\n')
      pyAesCrypt.encryptFile(fullPath, fullNewf, password1, bufferSize)
      shutil.move(fullPath + '.aes', destinationPath)

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

shutil.Error: Путь назначения 'E: \ AAA \ Folder \ Folder \ Temp2 \ Text.txt.aes 'уже существует

Поэтому мне нужно знать, как переименовать файлы с повторяющимися именами в процессе их перемещения, а затем переместить их, но не знаю, как действовать .

1 Ответ

1 голос
/ 04 апреля 2020
def make_unique_filename(file_path):
    duplicate_nr = 0
    base, extension = os.path.splitext(file_path)
    while os.path.exists(file_path):
        duplicate_nr += 1
        file_path = f'{base}({duplicate_nr}){extension}'

    return file_path

, а затем

os.rename(src_file_path, make_unique_filename(dest_file_path))

shutil.move перемещается в место назначения каталога.

Использовать os.rename проще. Перемещает файл в новый файл назначения. Новый файл директории назначения должен быть уникальным, что вы можете сделать с помощью make_unique_filename.

Этот код работает для меня сейчас. Была еще одна проблема с вашим os.path.join. Это не обязательно. glob.glob уже возвращает полный путь.

import pyAesCrypt
import os
import glob

sourcePath = r'E:\test aes\src'
destinationPath = r'E:\test aes\dst'

bufferSize = 64 * 1024
password1 = 'password'

def make_unique_filename(file_path):
    duplicate_nr = 0
    base, extension = os.path.splitext(file_path)
    while os.path.exists(file_path):
        duplicate_nr += 1
        file_path = f'{base}({duplicate_nr}){extension}'

   return file_path


for archivo in glob.glob(sourcePath + '\\**\*', recursive=True):
    fullPath = archivo
    fullNewf = archivo + '.aes'

    if os.path.isfile(fullPath):
        print('>>> Original: \t' + fullPath + '')
        print('>>> Encrypted: \t' + fullNewf + '\n')
        pyAesCrypt.encryptFile(fullPath, fullNewf, password1, bufferSize)

        destination_file_path = os.path.join(destinationPath, os.path.split(fullNewf)[1])
        destination_file_path = make_unique_filename(destination_file_path)
        print(destination_file_path)
        os.rename(fullNewf, destination_file_path)
...