gpt4 book ai didi

python - 在Python中选择性提取和打开zip文件

转载 作者:行者123 更新时间:2023-12-01 05:27:17 25 4
gpt4 key购买 nike

从文档来看,似乎可以使用 native python 中的 zipfile 模块执行选择性文件提取和打开,http://docs.python.org/2/library/zipfile使用

ZipFile.extract(member[, path[, pwd]])

Extract a member from the archive to the current working directory; member must be its full name or a ZipInfo object). Its file information is extracted as accurately as possible. path specifies a different directory to extract to. member can be a filename or a ZipInfo object. pwd is the password used for encrypted files.

我有一个 zip 文件,例如 foobar.zip:

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()

编辑:代码或我读取文件的方式没有任何问题。我认为我的 zip 文件有问题,导致 schroedinbug有时我的子目录文件无法打开,并且 inzipfile.open(infile,'r').read() 返回 None 。现在它提取、打开并打印文件的内容。

知道如何在 python 代码中检查 .zip 文件中的所有文件是否可以使用上面的选择性提取/打开方法打开吗?

我还能如何执行选择性提取/打开 zip 文件?还有更 Pythonic 的方法吗?

最佳答案

您的代码问题。它正在打开并读取也在 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(),它应该会打印出以下几行内容:

File Name                                             Modified             Size
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()

我能想到的检查是否可以打开存档的所有 [文件] 成员的唯一方法是实际尝试对每个成员执行此操作:

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

关于python - 在Python中选择性提取和打开zip文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21075999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com