0

我正在尝试制作一个应该解压缩一堆文件的脚本。对于其中一些 zip 文件,没有由文件夹组成的结构。这意味着所有文件都放在同一级别的存档中,当我尝试解压缩它们时,zip 文件中包含的所有文件都在同一级别提取。因此,所有文件都混合在一起,而不是单独放置在相应的存档中。

我的想法是创建一个从相应的 zip 存档命名的新文件夹,并对工作目录中包含的所有 zip 文件执行此操作。但是,如果我使用 makedirs(),我不会得到它。

这是我的代码:

os.chdir(directory)
cwd = os.getcwd()
print("Working directory :",cwd)

for ArchivesZip in glob.glob(os.path.join(directory,'*.zip')):
    zip_ref = zipfile.ZipFile(ArchivesZip,'r')
    dir = os.path.join("extractions",ArchivesZip)
    if not os.path.exists(dir):
        os.mkdir(ArchivesZip)
        zip_ref.extractall(dir)

谢谢你的建议...

4

2 回答 2

0

您正在尝试创建一个与您正在解压缩的存档名称相同的文件夹:

os.mkdir(ArchivesZip)

你可能想要:

os.makedirs(dir)

现在应该将每个 .zip 文件解压缩到工作目录中的“extractions/path/to/archive.zip”文件夹中。
如果要更改提取文件的位置,只需相应地修改dir变量即可。
我不确定你到底想要什么,但os.path.basename()os.path.splitext()可能有用。

另外,请注意,它会dir遮蔽dir()内置,因此它是一个错误的变量名。

于 2013-09-01T08:47:51.720 回答
0

谢谢你,斯特拉纳克。

此代码现在有效!

然而,只是有些事情困扰着我。首先,我需要为目录变量使用全局变量,可在提取按钮中重复使用。我不确定(当我开始学习 Python 时)仅将目录声明为全局变量是一个不错的选择。

欢迎任何改进代码的建议:)

   # -*- coding: iso-8859-1 -*-
from Tkinter import *
import zipfile,os,tkFileDialog,Tkinter,glob
#déclaration variables fenêtre Tkinter
master = Tk()
master.minsize(800,100)

#création fonction pour bouton d'appel
def callback():
#Ouverture navigateur, choix du dossier qui contient les zips
    global directory
    directory = tkFileDialog.askdirectory(parent=master,initialdir="/Users/me/Downloads/",title='Please select a directory')
    if len(directory) > 0 :
        os.chdir(directory)
        cwd = os.getcwd()
        ExtractButton['state'] = 'active'


#ICI ça marche

def extraction():
#Ne cherche que les fichiers de type *.zip        
    for ArchivesZip in glob.glob(os.path.join(directory,'*.zip')):    
        truncated_file = os.path.splitext(os.path.basename(ArchivesZip))[0]
        print(truncated_file)
        if not os.path.exists(truncated_file):
            os.makedirs(truncated_file)
            zip_ref = zipfile.ZipFile(ArchivesZip,'r')
            zip_ref.extractall(truncated_file)
    ExtractButton['state'] = 'disabled'


#Appel des fonctions pour chacun des boutons. Parcourir et Extraire
SelectButton = Button(master, text="Parcourir", command=callback)
ExtractButton = Button(master, text="Extraction", state=DISABLED, command=extraction)

SelectButton.pack()
ExtractButton.pack()

mainloop()
于 2013-09-02T08:45:50.797 回答