1

我正在从一个文件夹(和子文件夹)创建一个 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 文件并在没有任何目录结构的情况下写入它。它甚至不需要主文件夹的目录结构,只需将主目录或子目录中的所有文件写入该 .zip 文件。

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

提前致谢。

问候, 阿卡什

4

1 回答 1

1

Glob 的设计不会扩展到子目录。它遵循 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 在这里进行了精彩的讨论。如果您没有使用 glob 的模式功能(例如所有文本文件的 *.txt 或扩展名前有数字的所有文本文件的 *[0-9].txt),那么我认为您的 os.walk 解决方案更好

于 2011-02-07T16:20:08.587 回答