【问题标题】:Using Python to add a list of files into a zip file使用 Python 将文件列表添加到 zip 文件中
【发布时间】:2014-10-22 01:27:10
【问题描述】:

我想编写一个脚本来将所有“.py”文件添加到一个 zip 文件中。

这是我所拥有的:

import zipfile
import os

working_folder = 'C:\\Python27\\'

files = os.listdir(working_folder)

files_py = []

for f in files:
    if f[-2:] == 'py':
        fff = working_folder + f
        files_py.append(fff)

ZipFile = zipfile.ZipFile("zip testing.zip", "w" )

for a in files_py:
    ZipFile.write(a, zipfile.ZIP_DEFLATED)

但是它给出了一个错误:

Traceback (most recent call last):
  File "C:\Python27\working.py", line 19, in <module>
    ZipFile.write(str(a), zipfile.ZIP_DEFLATED)
  File "C:\Python27\lib\zipfile.py", line 1121, in write
    arcname = os.path.normpath(os.path.splitdrive(arcname)[1])
  File "C:\Python27\lib\ntpath.py", line 125, in splitdrive
    if p[1:2] == ':':
TypeError: 'int' object has no attribute '__getitem__'

看来给定的文件名不正确。

【问题讨论】:

  • 简单说明,使用 os.path.join(working_folder, f) 生成真实路径,不要直接使用字符串拼接'+'
  • @MarkK: 使用os.path(),您的代码可以更轻松地跨平台,因为库会处理正确的路径分隔符。您也不必太在意在working_folder 末尾提供路径分隔符。
  • @MarkK:在同一张纸条上,您可以使用str.endswith() 代替切片:if f.endswith('.py'):
  • @MarkK: 和ZipFile 不需要将任何内容收集到一个文件夹中。您可以给它任何文件列表,然后提供第二个arcname 参数来指定存档中的文件名(带路径)。例如,os.path.basename() 可以将所有文件放在一个平面层次结构中。
  • @MarkK 正如马丁大师所说:D 你的代码将是跨平台的,它不会破坏你在 windows 或 linux 上运行,也比直接处理字符串更好,因为你不不必添加额外的检查。检查 os.path 函数的文档,您会在那里找到一些很棒的信息,干杯!

标签: python zipfile


【解决方案1】:

原文于 2014 年 9 月 2 日 3:52 回答

根据上面的指导,最终结果是: (只是将它们放在一起以防万一)

import zipfile
import os

working_folder = 'C:\\Python27\\'

files = os.listdir(working_folder)

files_py = []

for f in files:
    if f.endswith('py'):
        fff = os.path.join(working_folder, f)
        files_py.append(fff)

ZipFile = zipfile.ZipFile("zip testing3.zip", "w" )

for a in files_py:
    ZipFile.write(os.path.basename(a), compress_type=zipfile.ZIP_DEFLATED)
ZipFile.close()

于 2020 年 3 月添加 在@jinzy zip file and avoid directory structure 的启发下,上面的最后一行改为下面,以避免 zip 文件中的文件结构。

ZipFile.write(a, "C:\\" + os.path.basename(a), compress_type=zipfile.ZIP_DEFLATED)

【讨论】:

  • 在 for 循环之后,您应该使用 ZipFile.close() 关闭 ZipFile
【解决方案2】:

您需要将压缩类型作为关键字参数传入:

ZipFile.write(a, compress_type=zipfile.ZIP_DEFLATED)

如果没有关键字参数,您将给 ZipFile.write() 一个整数 arcname 参数,这会导致您看到的错误,因为 arcname 正在被规范化。

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多