zipfile将zip解压缩到一个文件夹

时间:2018-07-20 01:24:57

标签: python zipfile

下面是文件结构的样子

music_folder
    album1.zip (below are contents inside of zip)
        song1.mp3
        song2.mp3
        song3.mp3
    album2.zip (below are contents inside of zip)
        song12.mp3
        song14.mp3
        song16.mp3

我想将两个压缩的相册都提取到名为cache的目录中,并且我希望使用相同的结构。 这是我想要的样子:

cache
    album1 (this is a normal unzipped folder)
        song1.mp3
        song2.mp3
        song3.mp3
    album2 (this is a normal unzipped folder)
        song12.mp3
        song14.mp3
        song16.mp3

但是由于某些原因,对于album1,文件直接提取到cache目录中,而不是cache/album1

这是它的样子,我不想要这个

cache
    song1.mp3
    song2.mp3
    song3.mp3
    album2 (this is a normal unzipped folder)
        song12.mp3
        song14.mp3
        song16.mp3

下面是我的代码:

for zipped_album in os.listdir('music_folder'):
    zip_ref = ZipFile('music_folder/' + zipped_album, 'r')
    zip_ref.extractall('cache')
    zip_ref.close()

为什么不将文件提取到chache的{​​{1}}内的文件夹中?它适用于album1

1 个答案:

答案 0 :(得分:1)

Zip文件可以包含(相对)路径名,而不仅仅是文件名。

因此,album2.zip的内容实际上很可能是

  • album2 / song1.mp3
  • album2 / song2.mp3
  • album2 / song3.mp3

…但是album1.zip只是:

  • song1.mp3
  • song2.mp3
  • song3.mp3

要对此进行测试,可以从外壳中执行unzip -l album1.zipunzip -l album2.zip


这实际上是人们一直在共享zipfile时遇到的一个问题。您通常希望在路径中包含该album2,但有时会丢失。您不想强行添加它并以album2/album2/song1.mp3结尾,但是您不想添加它并以顶部目录中的song1.mp3结尾。

当今大多数GUI工具使用的解决方案(我认为它可以追溯到古老的Stuffit Expander)是

  • Iterate all of the zip entries,然后查看所有路径名是否都从同一目录开始。
  • 如果是这样,请直接将其解压缩。
  • 如果不是,请创建一个与zipfile相同名称的目录(减去.zip),然后将其解压缩到该目录中。

棘手的一点是zipfile路径可以是Windows或POSIX格式,它们可以是绝对路径或UNC路径,甚至可以是以..开头的路径,而将其转换为可用路径的逻辑是不完全是困难,而不仅仅是一线。因此,您必须确定要使代码完全通用的程度。