0

我有以下代码:

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

我做错了什么?

4

2 回答 2

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):
            ...
于 2013-02-07T20:47:14.773 回答
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)

一切都按预期工作。

非常感谢所有试图提供帮助的人。下次我将发布完整的源代码,或者最后再发布几行。:)

于 2013-02-08T11:51:08.950 回答