我正在从文件夹(和子文件夹)创建一个Zip文件。它工作正常,并创建一个新的.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()
现在第二个代码即使在文件夹/子文件夹中也会获取所有文件,创建一个新的.zip文件并在没有任何目录结构的情况下写入它。它甚至不需要主文件夹的dir结构,只需将主目录或子目录中的所有文件写入该.zip文件。
任何人都可以帮助我或建议我。我更喜欢使用glob.glob而不是第二个选项。
提前致谢。
此致 阿卡什
答案 0 :(得分:1)
Glob by design不会扩展到子目录。它遵循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解决方案更好