为什么我的zipfile没有添加一些文件

时间:2013-02-07 19:36:07

标签: python python-2.7 zip zipfile

我有以下代码:

with ZipFile('deploy.zip', 'w') as deploy:
    if os.path.isfile(artifact.source):
        deploy.write(artifact.source, artifact.target)
    else:
        for base, dirs, files in os.walk(artifact.source):
            for file_ in files:
                source = os.path.join(base, file_)
                target = os.path.join(base[base.index(artifact.target):], file_)
                deploy.write(source, target)

此代码完成后,只有artifact.source为文件时匹配的文件才会添加到deploy.zip中。在某些情况下,artifact.source将是一个目录(我也测试了这个案例),并且for部分将被执行。

以下行的结果有效,并且每次迭代都存在源:

source = os.path.join(base, file_)
target = os.path.join(base[base.index(artifact.target):], file_)

这里是我正在使用的完整代码:https://gist.github.com/khaoz/9b04d87b0900fba780f0 将config.project_root设置为“c:\ temp”之类的内容并删除导入配置行。 OBS:我是一个Python新手,所以忽略一些你会看到的垃圾代码:P

这是我的csv文件示例:https://gist.github.com/khaoz/e9a59390f415f22d46db

我做错了什么?

2 个答案:

答案 0 :(得分:1)

仅供参考

我对你做了什么的解释,这似乎有效。

from zipfile import ZipFile
from collections import namedtuple
import os

Artifact =  namedtuple('Artifact', ['source', 'target'])
artifact =  Artifact(source="Mongodb", target="g")

with ZipFile('deploy.zip', 'w') as deploy:
    if os.path.isfile(artifact.source):
        print "F"
        print "\n", artifact.source
        print "\n", artifact.target
        deploy.write(artifact.source, artifact.target)
    else:
        for base, dirs, files in os.walk(artifact.source):
            for file_ in files:
                print "base", base, file_
                source = os.path.join(base, file_)
                target = os.path.join(base[base.index(artifact.target):], file_)
                print "f"
                print "\t", source
                print "\t", target
                deploy.write(source, target)

unzip -l deploy.zip | tail

     2591  01-09-13 21:26   godb/Sortif/scratch.py
     2010  01-15-13 20:20   godb/Sortif/sortif_model.py
     2495  01-15-13 20:22   godb/Sortif/sortif_model.pyc
      161  01-15-13 20:45   godb/Sortif/sortif_scratch.py
        0  01-08-13 12:05   godb/Sortif/sortif/__init__.py
        0  01-08-13 12:05   godb/Sortif/sortif/models/__init__.py
     1408  01-21-13 18:05   godb/ZeroMQ/client.py
     3044  01-21-13 17:51   godb/ZeroMQ/controller.py
 --------                   -------
 11137644                   967 files

我不确定您要使用base[base.index(artifact.target):]尝试实现的目标是否要更改前缀?因为在我的Mongodb目录target上运行它必须出现在文件base的目录中。

我不确定您希望如何驱动代码,因为artifact.source似乎是常量。所以第一次找到一个文件,它就永远不会在它寻找目录的地方做。

不应该是

with ZipFile('deploy.zip', 'w') as deploy:
    for artifact in articats:
        if os.path.isfile(artifact.source):
            ...

答案 1 :(得分:0)

我发现了这个问题。有时,睡眠是形成一些问题的最佳解决方案

我在做:

for artifact in artifacts:
    if not artifact.name in contents:
        contents.append(artifact.name)

    with ZipFile('deploy.zip', 'w') as deploy:
        if os.path.isfile(artifact.source):
            deploy.write(artifact.source, artifact.target)
        else:
            for base, dirs, files in os.walk(artifact.source):
                for file_ in files:
                    source = os.path.join(base, file_)
                    target = os.path.join(base[base.index(artifact.target):], file_)
                    deploy.write(source, target)

但是对于工件中的每次迭代都会关闭并打开一个新的deploy.zip文件。

正确的方法是:

with ZipFile('deploy.zip', 'w') as deploy:
    for artifact in artifacts:
        if not artifact.name in contents:
            contents.append(artifact.name)

        if os.path.isfile(artifact.source):
            deploy.write(artifact.source, artifact.target)
        else:
            for base, dirs, files in os.walk(artifact.source):
                for file_ in files:
                    source = os.path.join(base, file_)
                    target = os.path.join(base[base.index(artifact.target):], file_)
                    deploy.write(source, target)

一切都按预期工作。

非常感谢那些试图提供帮助的人。下次我将发布完整的源代码或者最后发布一些更多的代码。 :)