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

从文档中可以看出,可以使用本机python中的zipfile模块,使用

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] != '/'))