2015-09-17 9 views
9

を維持しながらshutil.make_archiveを使用してディレクトリを()圧縮:私は次のコードを使用して<code>test_dicoms.zip</code>という名前のzipファイルに<code>test_dicoms</code>というディレクトリを圧縮しようとしているディレクトリ構造

shutil.make_archive('/home/code/test_dicoms','zip','/home/code/test_dicoms')

問題がときということですファイルを解凍すると、/test_dicoms/にあるすべてのファイルが/test_dicoms/の代わりに/home/code/に抽出され、そのすべてのファイルが/home/code/に抽出されています。だから/test_dicoms/にはfoo.txtというファイルがあり、その後、私はzipして解凍した後foo.txtのパスは/home/code/test_dicoms/foo.txtではなく/home/code/foo.txtです。これをどうやって解決するのですか?また、私が扱っているディレクトリのいくつかは非常に大きいです。 ZIP64にするためにコードに何かを追加する必要がありますか、それを自動的に行うには十分な機能ですか?

はここで作成されたアーカイブには、現在何だ:

[[email protected] gwarner]$ unzip -l test_dicoms.zip 
Archive: test_dicoms.zip 
Length Date  Time Name 
--------- ---------- ----- ---- 
    93324 09-17-2015 16:05 AAscout_b_000070 
    93332 09-17-2015 16:05 AAscout_b_000125 
    93332 09-17-2015 16:05 AAscout_b_000248 
+0

著作を入力してくださいzipディレクトリの貼り付け。たとえば、Linuxを使用している場合は、 'unzip -l test_dicoms.zip'を実行します。 –

+0

'[gwarner @ジャズgwarner] $解凍-l test_dicoms.zip アーカイブ:test_dicoms.zip 長日付時間名 --------- ---------- - ---- ---- 93324 2015年9月17日16時05分AAscout_b_000070 93332 2015年9月17日16時05分AAscout_b_000125 93332 2015年9月17日16時05分AAscout_b_000248' –

答えて

14

ドキュメント内の用語を使用して、ROOT_DIR指定ではなくBASE_DIRています。そのようBASE_DIRを指定してみてください:あなたの2つ目の質問に答えるために

shutil.make_archive('/home/code/test_dicoms', 
        'zip', 
        '/home/code/', 
        'test_dicoms') 

、それはあなたが使用しているのPythonのバージョンに依存します。 Python 3.4以降、ZIP64拡張はデフォルトで使用可能になります。 Python 3.4より前のバージョンでは、make_archiveは自動的にZIP64拡張機能を持つファイルを作成しません。古いバージョンのPythonを使用していて、ZIP64が必要な場合は、基礎となるzipfile.ZipFile()を直接呼び出すことができます。

あなたがshutil.make_archive()をバイパスし、直接zipfile.ZipFile()を使用することを選択した場合、ここでの例です:

import zipfile 
import os 

d = '/home/code/test_dicoms' 

os.chdir(os.path.dirname(d)) 
with zipfile.ZipFile(d + '.zip', 
        "w", 
        zipfile.ZIP_DEFLATED, 
        allowZip64=True) as zf: 
    for root, _, filenames in os.walk(os.path.basename(d)): 
     for name in filenames: 
      name = os.path.join(root, name) 
      name = os.path.normpath(name) 
      zf.write(name, name) 

はリファレンス:

+1

あなたが意味を明確してください直接 "基本的な' zipfile.ZipFile() 'を呼び出します。 – martineau

+0

例が追加されました。 –

+0

python 3.4+がデフォルトでzip64をサポートしています。http://bugs.python.org/issue17189 – aforaudrey

関連する問題