私は奇妙な状況を強制していることを知っているので、質問は奇妙に聞こえるかもしれません>それは偶然に出てきました (バグと言うかもしれません)。
私が見ている行動を本当に理解したいです。
この機能のポイントは、ディレクトリ内の特定のプレフィックスを持つすべてのファイルをアーカイブに追加することです。「バグ」にもかかわらず、プログラムは正しく動作することに気付きました (sic!)。理由を理解したかった。
コードはかなり単純なので、関数全体を投稿できます。
def pack(prefix, custom_meta_files = []):
postfix = 'tgz'
if prefix[-1] != '.':
postfix = '.tgz'
archive = tarfile.open(prefix+postfix, "w:gz")
files = filter(lambda path: path.startswith(prefix), os.listdir())
#print('files: {0}'.format(list(files)))
for file in files:
print('packing `{0}`'.format(file))
archive_name = file[len(prefix):] #skip prefix + dot
archive.add(file, archive_name)
not_doubled_metas = set(custom_meta_files) - set(archive.getnames())
print('metas to add: {0}'.format(not_doubled_metas))
for meta in not_doubled_metas:
print('packing `{0}`'.format(meta))
archive.add(meta)
print('contents:{0}'.format(archive.getnames()))
お気づきのように、 を使用してアーカイブを作成し、prefix
すべてをリストしてパックするファイルのリストを作成しcwd
、ラムダを介してフィルター処理します。当然、アーカイブはフィルターを通過します。重要ではないと思いますが、名前が重複しない場合に固定ファイルを追加するスニペットもあります。
したがって、そのような実行からの出力は次のとおりです。
packing `ga_run.seq_niche.N30.1.bt0_5K.params`
packing `ga_run.seq_niche.N30.1.bt0_5K.stats`
packing `ga_run.seq_niche.N30.1.bt0_5K.tgz`
metas to add: {'stats.meta'}
packing `stats.meta`
contents:['params', 'stats', 'stats.meta']
そのため、スクリプトは自分自身を追加しようとしましたが、最終的なコンテンツには表示されません。予想される動作が何であるかはわかりませんが、警告はまったくなく、ドキュメントには何も言及されていません。メンバーを追加するメソッドに関する部分を読み、検索を使用しましたitself
およびsame name
.
自動的にスキップされると思いますが、実際に確認する方法がわかりません。個人的には長さゼロのファイルをメンバーとして追加することを期待していますが、実際にはもっと理にかなっているので、スキップすることは理解しています。
質問tarfile.add()
アーカイブをそれ自体に追加することを無視するのは望ましい動作ですか? どこで言われていますか?