python中zipfile的选择性提取和打开
从文档中可以看出,可以使用本机python中的zipfile模块,使用python中zipfile的选择性提取和打开,python,if-statement,file-io,zip,zipfile,Python,If Statement,File Io,Zip,Zipfile,从文档中可以看出,可以使用本机python中的zipfile模块,使用 ZipFile.extract(成员[,路径[,pwd]]) 将存档中的成员提取到当前工作目录; 成员必须是其全名或ZipInfo对象)。它的档案 尽可能准确地提取信息。路径指定一个 要提取到的不同目录。成员可以是文件名或 ZipInfo对象。pwd是用于加密文件的密码 我有一个类似于foobar.zip的zipfile foobar.zip\ \foo \a.txt \b.txt \bar
ZipFile.extract(成员[,路径[,pwd]])
将存档中的成员提取到当前工作目录;
成员必须是其全名或ZipInfo对象)。它的档案
尽可能准确地提取信息。路径指定一个
要提取到的不同目录。成员可以是文件名或
ZipInfo对象。pwd是用于加密文件的密码
我有一个类似于foobar.zip的zipfile
foobar.zip\
\foo
\a.txt
\b.txt
\bar
\b.txt
\c.txt
我尝试从.zip文件的单个子目录中提取文件,但有时它不会打印任何内容:
import zipfile
with zipfile.ZipFile('foobar.zip','r') as inzipfile:
for infile in inzipfile.namelist():
if 'foo' in os.path.split(infile)[0]:
print inzipfile.open(infile,'r').read()
我试图给出一个我可能想要提取的选定文件的列表,但有时它也不会打印任何内容
wanted = ['a.txt', 'b.txt']
import zipfile
with zipfile.ZipFile('foobar.zip','r') as inzipfile:
for infile in inzipfile.namelist():
if os.path.split(infile)[1] in wanted:
print inzipfile.open(infile,'r').read()
编辑:
代码和我读取文件的方式都没有问题。我认为我的zipfile有问题,这导致有时我的子目录文件无法打开,而inzipfile.open(infle,'r').read()
不会返回任何文件。现在,它提取、打开并打印文件的内容
您知道如何在python代码中检查.zip文件中的所有文件都可以使用上述选择性提取/打开方法打开吗?
我还可以如何执行zipfiles的选择性提取/打开?是否有更类似python的方法?您的代码有问题。它正在打开并读取文件夹名,文件夹名也位于inzipfile.namelist()
中。您可以通过以下方式看到这一点:
print inzipfile.namelist()
这将输出:
['foobar/bar/','foobar/bar/b.txt','foobar/bar/c.txt','foobar/foo/',
'foobar/foo/a.txt','foobar/foo/b.txt','foobar/']
另一种方法是使用inzipfile.printdir()
,这将导致打印以下内容:
文件名修改大小
foobar/bar/2014-01-12 08:53:36 0
foobar/bar/b.txt 2014-01-12 08:54:08 60
foobar/bar/c.txt 2014-01-12 08:54:28 60
foobar/foo/2014-01-12 08:53:02 0
foobar/foo/a.txt 2014-01-12 08:55:04 60
foobar/foo/b.txt 2014-01-12 08:55:24 60
foobar/2014-01-12 08:52:32 0
请注意,在这两种情况下,所有文件夹条目的名称都以/
字符结尾。您可以将其用作检测它们的简单方法:
import os
import zipfile
with zipfile.ZipFile('foobar.zip', 'r') as inzipfile:
for infile in (name for name in inzipfile.namelist() if name[-1] != '/'):
if 'foo' in os.path.split(infile)[0]:
print inzipfile.open(infile,'r').read(),
同样地:
wanted = {'a.txt', 'b.txt'} # use a set, it's faster for testing membership
import zipfile
with zipfile.ZipFile('foobar.zip','r') as inzipfile:
for infile in (name for name in inzipfile.namelist() if name[-1] != '/'):
if os.path.split(infile)[1] in wanted:
print inzipfile.open(infile,'r').read()
我能想到的检查归档文件中所有[file]成员是否都可以打开的唯一方法是,实际尝试对每个成员进行打开:
def check_files(zipfilename):
""" Check and see if all members of a .zip archive can be opened.
Beware of vacuous truth - all members of an empty archive can be opened
"""
def can_open(archive, membername):
try:
archive.open(membername, 'r') # return value ignored
except (RuntimeError, zipfile.BadZipfile, zipfile.LargeZipFile):
return False
return True
with zipfile.ZipFile(zipfilename, 'r') as archive:
return all(can_open(archive, membername)
for membername in (
name for name in archive.namelist() if name[-1] != '/'))