繁体   English   中英

以 rar 文件的名称解压文件

[英]Unrar the files with the name of the rar files

我有 4 个 rar(压缩)文件的文件夹。

截图 #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 文件中的文件。 我希望将文件重命名为 rarfile1 中的 file1、rarfile1 中的 file2、rarfile1 中的 file3、rarfile2 中的 file1,依此类推...

这是我想要的结果:

[屏幕截图 #2:解压缩文件及其新名称]

/root/
    - example1.rar
    - example2.rar

实现这一目标的一种方法是执行这些步骤,但我相信肯定会有更好的方法:

  1. 临时创建一个与您的 rar 文件同名的目录。 (/root/example1.rar 文件的目录 /root/example1/
  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. 以这种方式循环所有 Rars。 最终结果:

     /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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM