下面是文件结构的样子
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
答案 0 :(得分:1)
Zip文件可以包含(相对)路径名,而不仅仅是文件名。
因此,album2.zip
的内容实际上很可能是
…但是album1.zip
只是:
要对此进行测试,可以从外壳中执行unzip -l album1.zip
和unzip -l album2.zip
。
这实际上是人们一直在共享zipfile时遇到的一个问题。您通常希望在路径中包含该album2
,但有时会丢失。您不想强行添加它并以album2/album2/song1.mp3
结尾,但是您不想添加它并以顶部目录中的song1.mp3
结尾。
当今大多数GUI工具使用的解决方案(我认为它可以追溯到古老的Stuffit Expander)是
.zip
),然后将其解压缩到该目录中。棘手的一点是zipfile路径可以是Windows或POSIX格式,它们可以是绝对路径或UNC路径,甚至可以是以..
开头的路径,而将其转换为可用路径的逻辑是不完全是困难,而不仅仅是一线。因此,您必须确定要使代码完全通用的程度。