如何在Python中读取压缩文件夹中的文本文件

时间:2014-03-25 21:26:20

标签: python python-2.7 zip

我有一个压缩数据文件(全部在文件夹中,然后压缩)。我想在不解压缩的情况下阅读每个文件。我尝试了几种方法,但没有任何方法可以输入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

3 个答案:

答案 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'))