存档/压缩文件 python

Posted

技术标签:

【中文标题】存档/压缩文件 python【英文标题】:Archive / Zipfile python 【发布时间】:2013-03-09 20:12:29 【问题描述】:

课程文本中的 zipfile 示例存储了它保存到 zipfile 的文件的完整路径。然而,通常情况下,压缩文件只包含一个相对路径名(您会看到,在创建压缩文件后列出名称时,“v:\”已被删除)。

在这个项目中,编写一个函数,该函数采用目录路径并仅创建目录的存档。例如,如果使用与示例中相同的路径(“v:\workspace\Archives\src\archive_me”),则 zip 文件将包含“archive_me\groucho”、“archive_me\harpo”和“archive_me\chico”。 请注意,zipfile.namelist() 在其返回的内容中始终使用正斜杠,在比较观察到的和预期时需要适应这一事实。

基本目录(上例中的“archive_me”)是输入的最后一个元素,zipfile 中记录的所有路径都应以基本目录开头。

如果目录包含子目录,则不应包含子目录名称和子目录中的任何文件。 (提示:您可以使用 isfile() 来确定文件名是否代表常规文件而不是目录。)

我有以下代码:

 import os, shutil, zipfile, unittest

 def my_archive(path):
     x = os.path.basename(path)
     zf = zipfile.ZipFile(x, "w")
     filenames = glob.glob(os.path.join(x, "*"))
     print(filenames)
     for fn in filenames:
          zf.write(fn)
          zf.close
     zf = zipfile.ZipFile(path)
     lst =  zf.namelist()
     return(lst)
     zf.close()


 import os, shutil, zipfile, unittest
 import archive_dir

 class TestArchiveDir(unittest.TestCase):

     def setUp(self):
         self.parentPath = r"/Users/Temp"
         self.basedir = 'archive_me'
         self.path = os.path.join(self.parentPath,self.basedir)
         if not os.path.exists(self.path):
             os.makedirs(self.path)
         self.filenames = ["groucho", "harpo", "chico"]
         for fn in self.filenames:
             f = open(os.path.join(self.path, fn), "w")
             f.close()

     def test_archive_create(self):

         observed = archive_dir.my_archive(self.path)
         expected = ["archive_me/groucho", "archive_me/harpo", "archive_me/chico"]
         self.assertEqual(set(expected), set(observed))

     def tearDown(self):
         try:
             shutil.rmtree(self.parentPath, ignore_errors=True)
         except IOError:
             pass

 if __name__=="__main__":
     unittest.main()

我收到“IOError: [Errno 21] Is a directory: 'archive_me'”的错误我知道这是由于我试图压缩档案造成的......但我不知道如何纠正这个.如何仅获取要压缩的文件并通过测试?

谢谢

【问题讨论】:

【参考方案1】:

查看您问题中的提示(可能与作业相关)并思考它与您所看到的 IOError 有何关系。

其他一些提示/提示:

    尝试在处理内容时打印信息,而不是一次打印所有内容 - 这将有助于跟踪错误并为用户提供进度指示;

    看看能不能定位到错误产生的位置,给用户更好的反馈;

    将每个函数视为一项工作,并了解它与 my_archive 正在做什么(无论是在测试中如何使用,还是在实际使用中);

    函数的名称应该描述它们的作用——通常的模式是verb_noun

【讨论】:

【参考方案2】:

现在的编写方式是在每次 for 循环迭代后关闭 zipfile。此外,您的 zipfile 与您的目标目录命名相同,试试这个:

#!/usr/bin/python3

import zipfile
import os
import glob

def archdir(dir):
    x = os.path.basename(dir) + ".zip"
    zf = zipfile.ZipFile(x, "w")
    filenames = glob.glob(os.path.join(os.path.basename(dir), "*"))
    print(filenames)
    for fn in filenames:
        zf.write(fn)
    zf.close()

【讨论】:

以上是关于存档/压缩文件 python的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 将文件压缩为受密码保护的存档

python 3 - 读取压缩存档中的文件将'b'字符放在每行的开头

将文件压缩到内存并以字节python的形式读取整个存档

C 中的嵌入式 python:有没有办法从压缩的 python 存档中正确导入 numpy?

在python中按块解压缩文件夹

编辑文件而不解压缩存档