如何在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
,这就是我想以优雅的方式获得的。
答案 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