我有以下代码:
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
我做错了什么?
答案 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)
一切都按预期工作。
非常感谢那些试图提供帮助的人。下次我将发布完整的源代码或者最后发布一些更多的代码。 :)