Python zipfile将zip解压缩到文件夹

Python zipfile将zip解压缩到文件夹,python,zipfile,Python,Zipfile,下面是文件结构的外观 我想将两个压缩相册提取到一个名为cache的目录中,并且我想要相同的结构。这就是我希望它看起来的样子: 但由于某些原因,对于album1,文件直接在缓存目录中提取,而不是在cache/album1中提取 这就是它看起来的样子,我不想要这个: 下面是我的代码: 你知道为什么文件没有被提取到album1的chache文件夹中吗?它适用于album2,Zip文件可以包含相对路径名,而不仅仅是文件名 因此,album2.zip的内容实际上很可能是: 专辑2/song1.mp3 专辑

下面是文件结构的外观

我想将两个压缩相册提取到一个名为cache的目录中,并且我想要相同的结构。这就是我希望它看起来的样子:

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

这就是它看起来的样子,我不想要这个:

下面是我的代码:


你知道为什么文件没有被提取到album1的chache文件夹中吗?它适用于album2,Zip文件可以包含相对路径名,而不仅仅是文件名

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

专辑2/song1.mp3 专辑2/song2.mp3 专辑2/song3.mp3 …但album1.zip只是:

歌曲1.mp3 歌曲2.mp3 歌曲3.mp3 为了测试这一点,您可以从shell中解压-l album1.zip和解压-l album2.zip

这实际上是一个问题,人们一直以来都在共享ZipFile。您通常希望在路径中包含该album2,但有时会丢失它。您不希望强制添加它,最终得到album2/album2/song1.mp3,但也不希望不添加它,最终得到顶部目录中的song1.mp3

现在大多数GUI工具使用的解决方案我认为可以追溯到古老的Stuffit Expander:

并查看路径名是否都以相同的目录开头。 如果是,请按原样解压。 如果没有,请创建一个与zipfile名称相同的目录,减去.zip,然后将它们解压缩到该目录中。
一个棘手的问题是zipfile路径可以是Windows或POSIX格式,也可以是绝对路径或UNC路径,甚至可以是以..开头的路径,而将这些路径转换为可用路径的逻辑虽然并不困难,但不仅仅是一行。因此,您必须决定要使代码完全通用到什么程度。

zip文件没有这种结构,您的代码也没有创建这种结构。你还期待什么?谢谢你的精彩解释和解决方案
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
    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
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()