ZipFile extract()后获取本地文件名

时间:2015-03-20 19:32:54

标签: python zipfile

如何在ZipFile extract()运行后获取本地文件名?

当我这样做时:

    with zipfile.ZipFile(localZipFilePath, "r") as zf:
        for name in zf.namelist():
            localFilePath = zf.extract(name, '/tmp/')
            print localFilePath

zip文件中存在的文件是:src/xyz/somefile.txt

localFilePath输出:/tmp/src

这里写的文件:/tmp/src/xyz/somefile.txt,这就是我想以优雅的方式获得的。

2 个答案:

答案 0 :(得分:4)

我觉得你误会了什么。 ZipFile.extract() method始终返回完整路径,指向为该特定zipfile成员创建的目录或文件。

文档没有明确说明,source code for the method在这里很清楚:

if member.filename[-1] == '/':
    if not os.path.isdir(targetpath):
        os.mkdir(targetpath)
    return targetpath

with self.open(member, pwd=pwd) as source, \
     file(targetpath, "wb") as target:
    shutil.copyfileobj(source, target)

return targetpath 

因此,成员文件名在/(目录)中结束,在这种情况下创建目录,或者创建文件并复制数据。无论哪种方式,targetpath是刚刚创建的文件系统条目的本地路径。

opened a Python issue更新了文档;截至2015-03-15,文档已更新为:

  

返回创建的规范化路径(目录或新文件)。

答案 1 :(得分:0)

根本问题是我没有考虑文件夹是zip文件的一部分。我的代码只是为处理文件而设计的。

我通过添加if语句来修复我的代码来检测文件夹:

  with zipfile.ZipFile(localZipFilePath, "r") as zf:
        for name in zf.namelist():
            localFilePath = zf.extract(name, '/tmp/')
            if os.path.isdir(localFilePath):
                continue
            print localFilePath