我有包含文件和子目录的路径/ home / mine / new。我想仅压缩该路径中的文件(在“新”路径中),以便我的压缩文件夹包含/new/file1
,new/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
答案 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.listdir
和os.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)