Разархивируйте файлы с именем файлов rar

У меня есть папка с 4 rar (zip) файлами.

скриншот №1: RAR-файлы и имена

Это код Python для их распаковки:

#!/usr/bin/python
import os, zipfile, pyunpack, sys
import tkinter as tk
from tkinter import filedialog
from tkinter.filedialog import askdirectory

root = tk.Tk()
root.withdraw()

basis_folder = askdirectory(title='Select Folder')
    
for root, dirs, files in os.walk(basis_folder):
    for filename in files:
        if filename.endswith(".rar") :
            print('RAR:'+os.path.join(root,filename))
        elif filename.endswith(".zip"):
            print('ZIP:'+os.path.join(root,filename))
        name = os.path.splitext(os.path.basename(filename))[0]
        if filename.endswith(".rar") or filename.endswith(".zip"):
            try:
                arch = pyunpack.Archive(os.path.join(root,filename))
                # os.mkdir(name)
                arch.extractall(directory=root)
                os.remove(os.path.join(root,filename))
            except Exception as e:
                print("ERROR: BAD ARCHIVE "+os.path.join(root,filename))
                print(e)
                try:
                    # os.path.join(root,filename)os.remove(filename)
                    pass
                except OSError as e: # this would be "except OSError, e:" before Python 2.6
                    if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
                        raise # re-raise exception if a different error occured
                    sys.exit()
os._exit(0)

После процесса распаковки код удаляет файлы rar и извлекает файлы внутри файлов rar. Я хочу переименовать файлы как файл1 из rarfile1, файл2 из rarfile1, файл3 из rarfile1, файл1 из rarfile2 и так далее...

Это результат, который я хочу:

[скриншот 2: распаковать файлы и их новые имена]


person Dartagnan    schedule 24.12.2020    source источник


Ответы (1)


/root/
    - example1.rar
    - example2.rar

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

  1. Временно создайте каталог с тем же именем, что и у вашего rar-файла. (Директория /root/example1/ для файла /root/example1.rar
  2. Переместите файл Rar во временный каталог /root/example1/example1.rar.
  3. Извлеките все файлы из файла example1.rar в каталог example1.
    /root/
         example1/
         file1.ext
         file2.ext
         example1.rar
  1. Удалить файл .rar
 /root/    
      example1/
      file1.ext
      file2.ext
  1. Переименуйте все файлы в каталоге example1 в example1_file1.ext.
    /root/
       /example1/
               example1_file1.ext
               example1_file2.ext
  1. Переместить все файлы в /root/
        /root/
               /example1/
               example1_file1.ext
               example1_file2.ext
  1. Удалить каталог /example1/:
        /root/
               example1_file1.ext
               example1_file2.ext
  1. Прокрутите все RAR-файлы таким образом. Конечный результат :

     /root/
            example1_file1.ext
            example1_file2.ext
            example2_file1.ext
            example2_file2.ext
    

Я не запускал и не проверял код, но ваш код будет изменен в соответствии со следующими строками:

for root, dirs, files in os.walk(basis_folder):
for filename in files:
    if filename.endswith(".rar"):
        print('RAR:' + os.path.join(root, filename))
    elif filename.endswith(".zip"):
        print('ZIP:' + os.path.join(root, filename))
    name = os.path.splitext(os.path.basename(filename))[0]
    if filename.endswith(".rar") or filename.endswith(".zip"):
        try:
            # root/yourfile.rar
            curr_file_path = os.path.join(root, filename)
            # root/yourfile/
            new_file_dir = curr_file_path.split('.')[0]
            # root/yourfile/yourfile.rar
            new_file_path = os.path.join(new_file_dir, filename)
            os.mkdir(new_file_dir)
            os.replace(curr_file_path, new_file_path)
            arch = pyunpack.Archive(new_file_path)
            # extract files to root/yourfile
            arch.extractall(directory=new_file_dir)
            # Remove the Rar file
            os.remove(new_file_path)
            files_in_curr = [f for f in os.listdir(new_file_dir) if os.path.isfile(f)]
            for file in files_in_curr:
                new_name = os.path.join(new_file_dir, filename.split('.')[0] + '_' + file)
                # Rename file from root/yourfile/file1.ext to root/yourfile/yourfile_file1.ext
                os.rename(os.path.join(new_file_dir, file), new_name)
                # move file from root/yourfile/yourfile_file1.ext to root/yourfile_file1.ext
                os.replace(os.path.join(new_file_dir, new_name), os.path.join(root, new_name))
            # Remove the temporary empty directory
            os.rmdir(new_file_dir)

        except Exception as e:
            print("ERROR: BAD ARCHIVE " + os.path.join(root, filename))
            print(e)
            try:
                # os.path.join(root,filename)os.remove(filename)
                pass
            except OSError as e:  # this would be "except OSError, e:" before Python 2.6
                if e.errno != errno.ENOENT:  # errno.ENOENT = no such file or directory
                    raise  # re-raise exception if a different error occured
                sys.exit()
  os._exit(0)
person Deepak Gaur    schedule 25.12.2020
comment
Это лучшее решение. Спасибо, Дипак! - person Dartagnan; 25.12.2020