试图仅在一个目录中压缩文件

时间:2011-11-02 13:12:09

标签: python zip

我有包含文件和子目录的路径/ home / mine / new。我想仅压缩该路径中的文件(在“新”路径中),以便我的压缩文件夹包含/new/file1new/file2等。

我试过了:

import zipfile
import os,glob


def zipfunc(path, myzip):
    for path,dirs, files in os.walk(path):
            for file in files:
                if  os.path.isfile(os.path.join(path,file)):
                    myzip.write(os.path.join(os.path.basename(path), file))


if __name__ == '__main__':
    path=r'/home/ggous/new'
    myzip = zipfile.ZipFile('myzipped.zip', 'w')
    zipfunc(path,myzip)
    myzip.close()

但它给了我一个错误     没有这样的文件或目录new / file.doc

3 个答案:

答案 0 :(得分:2)

您在路径变量上调用os.path.basename。这意味着,如果您尝试压缩文件new/dir1/file1,则会删除路径的new/部分并最终使用dir1/file1,这不是相对于您的有效路径当前目录。

如果您只是删除对os.path.basename的调用,则会正确压缩文件:

myzip.write(os.path.join(path, file))

...虽然在路径方面这可能不是你想要的zipfile。如果您从顶级目录中启动os.walk,您可能会得到您想要的内容:

if __name__ == '__main__':
    path=os.path.join(os.getcwd(), 'new')
    myzip = zipfile.ZipFile('myzipped.zip', 'w')

    # Change into the top level directory.
    os.chdir(path)

    zipfunc('.',myzip)
    myzip.close()

给出这样的层次结构:

/home/lars/new
  file1
  file2
  dir1/
    file1
    file2
    file3

这会创建一个如下所示的zipfile:

Archive:  myzipped.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       29  11-02-2011 09:14   file1
       29  11-02-2011 09:14   file2
       29  11-02-2011 09:14   dir1/file3
       29  11-02-2011 09:14   dir1/file1
       29  11-02-2011 09:14   dir1/file2
---------                     -------
      145                     5 files

如果您的实际目标是仅压缩顶级文件而下降到任何子目录中,那么您实际上并不需要os.walk。您只需使用os.listdiros.path.isfile来确保您处理文件而不是子目录。

答案 1 :(得分:0)

那是因为os.walk将下降到子目录中(并且您的路径连接逻辑无法正确处理)。如果您不想递归到子目录中,请使用glob.glob代替os.walk

from os import path
import os

directory = r'/home/ggous/new'
for f in os.listdir(directory):
     if path.isfile(f):
         zipfile.write(os.path.basename(f), f)

答案 2 :(得分:0)

zipfile.ZipFile.write()需要绝对路径,而不是相对路径或不完整路径,这似乎是一个问题。在压缩指向的文件之前,请尝试确保路径是绝对路径:

def zipfunc(path, myzip):
    for path,dirs, files in os.walk(path):
            for file in files:
                curpath = os.path.abspath(os.path.join(path, file))
                if  os.path.isfile(curpath):
                    myzip.write(curpath)