unzipping a file with Python and returning all the directories it creates
如何用python将
1 2 3 4 5 6 7 | import zipfile def unzip(zip_file, outdir): """ Unzip a given 'zip_file' into the output directory 'outdir'. """ zf = zipfile.ZipFile(zip_file,"r") zf.extractall(outdir) |
我怎样才能让
编辑:对我来说最有意义的解决方案是只获取zip文件中的顶级目录,然后递归地遍历这些目录,这将确保我获得zip生成的所有文件。这有可能吗?名称列表的系统特定行为使其几乎不可能依赖
您可以使用
1 2 3 4 | >>> import zipfile >>> zip = zipfile.ZipFile('test.zip') >>> zip.namelist() ['dir2/', 'file1'] |
您可以在提取内容之前或之后执行此操作。
根据您的操作环境,
1 2 3 4 5 6 7 | ./file1 ./dir2 ./dir2/dir21 ./dir3 ./dir3/file3 ./dir3/dir31 ./dir3/dir31/file31 |
1 2 3 4 5 6 7 | [ 'file1', 'dir2/', 'dir2/dir21/', 'dir3/', 'dir3/file3', 'dir3/dir31/', 'dir3/dir31/file31' ] |
下面的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import zipfile import os def parent_dirs(pathname, subdirs=None): """Return a set of all individual directories contained in a pathname For example, if 'a/b/c.ext' is the path to the file 'c.ext': a/b/c.ext -> set(['a','a/b']) """ if subdirs is None: subdirs = set() parent = os.path.dirname(pathname) if parent: subdirs.add(parent) parent_dirs(parent, subdirs) return subdirs def dirs_in_zip(zf): """Return a list of directories that would be created by the ZipFile zf""" alldirs = set() for fn in zf.namelist(): alldirs.update(parent_dirs(fn)) return alldirs zf = zipfile.ZipFile(zipfilename, 'r') print(dirs_in_zip(zf)) |
假设没有其他人同时写入目标目录,在解压之前递归地遍历该目录,然后比较结果。
让它完成,然后阅读目录的内容——这里是一个很好的例子。