2010-05-24 15 views
1

我从文件夹(和子文件夹)创建Zip文件。它工作正常,并创建一个新的.zip文件,但我使用glob.glob时遇到问题。它正在读取所需文件夹(源文件夹)中的所有文件并写入新的zip文件,但问题是,它添加了子目录,但没有从子目录添加文件。使用glob.glob创建Zip文件的问题

我给予用户选择文件名和路径以及文件类型(Zip或Tar)的选项。我在创建.tar.gz文件时不会遇到任何问题,但在使用创建.zip文件时,会遇到此问题。

这里是我的代码:

for name in (Source_Dir): 
    for name in glob.glob("/path/to/source/dir/*"): 
     myZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED) 

myZip.close() 

另外,如果我用下面的代码:

for dirpath, dirnames, filenames in os.walk(Source_Dir): 
     myZip.write(os.path.join(dirpath, filename) os.path.basename(filename))   

myZip.close() 

现在第二个代码TAKS所有文件,即使该文件夹/文件夹内,创建一个新的.zip文件并在没有任何目录结构的情况下写入。它甚至不需要主文件夹的dir结构,只需将主目录或子目录中的所有文件写入该.zip文件即可。

任何人都可以请帮我或建议我。我更喜欢glob.glob而不是第二个选项来使用。

在此先感谢。

问候, 阿卡什

回答

1

水珠设计不扩展到子目录。它遵循UNIX样式路径规则和扩展,请参阅fnmatch的文档以获取更多信息。如果你想获得子目录,你需要将它添加到路径中。这个例子会让所有的事情都在一个层次上。

for name in (Source_Dir): 
    for name in glob.glob("/path/to/source/dir/*/*"): 
     myZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED) 

myZip.close() 

Doug Hellman有一个很好的讨论here。如果你没有使用glob的模式特性(比如* .txt用于所有文本文件,或者* [0-9] .txt用于所有扩展名前有数字的文本文件),那么我认为你的os.walk解决方案更好