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.sourcedeploy.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 に答える