我有一个压缩数据文件(全部在文件夹中,然后压缩)。我想在不解压缩的情况下阅读每个文件。我尝试了几种方法,但没有任何方法可以输入zip文件中的文件夹。我该怎么做?
zip文件中没有文件夹:
with zipfile.ZipFile('data.zip') as z:
for filename in z.namelist():
data = filename.readlines()
使用一个文件夹:
with zipfile.ZipFile('data.zip') as z:
for filename in z.namelist():
if filename.endswith('/'):
# Here is what I was stucked
答案 0 :(得分:18)
namelist()
以递归方式返回档案中所有项目的列表。
您可以通过致电os.path.isdir()来检查项目是否为目录:
import os
import zipfile
with zipfile.ZipFile('archive.zip') as z:
for filename in z.namelist():
if not os.path.isdir(filename):
# read the file
with z.open(filename) as f:
for line in f:
print line
希望有所帮助。
答案 1 :(得分:2)
我得到了Alec的代码。我做了一些小的修改:(注意,这不适用于受密码保护的zip文件)
import os
import sys
import zipfile
z = zipfile.ZipFile(sys.argv[1]) # Flexibility with regard to zipfile
for filename in z.namelist():
if not os.path.isdir(filename):
# read the file
for line in z.open(filename):
print line
z.close() # Close the file after opening it
del z # Cleanup (in case there's further work after this)
答案 2 :(得分:0)
我让 RichS 的代码起作用了。我做了一些小的修改:
import os
import sys
import zipfile
archive = sys.argv[1] # assuming launched with `python my_script.py archive.zip`
with zipfile.ZipFile(archive) as z:
for filename in z.namelist():
if not os.path.isdir(filename):
# read the file
for line in z.open(filename):
print(line.decode('utf-8'))
如您所见,修改很小。我已经切换到 Python 3,ZipFile 类有一个大写的 F,并且输出从 b 字符串转换为 unicode 字符串。仅当您尝试解压缩文本文件时才进行解码。
PS 我一点也不在贬低 RichS。我只是觉得这会很有趣。既实用又温和。
PPS 您可以使用密码从档案中获取文件:ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)
或 ZipFile.read(name, pwd=None)
。如果您使用 .read
,则没有上下文管理器,因此您只需执行
# read the file
print(z.read(filename).decode('utf-8'))