2

FTP サイトからファイルを解凍しようとしています。サブプロセスで7zを使用するだけでなく、古いos.system形式で7zを使用してみました。ただし、Python で zipfile モジュールを使用しているときは最も近いので、それに固執することにしました。これをどのように編集しても、2 つのエラーのうちの 1 つが表示されるようです。ここに両方の​​エラーを示します。壁に頭をぶつけている場所がわかります。

z = zipfile.ZipFile(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item)
z.extractall()

NotImplementedError: 圧縮タイプ 6 (内破) (これは完全に間違っていると思いますが、含めることにしました。)

私は次のように最も近いようです:

z = zipfile.ZipFile(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item)
z.extractall(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item)

IOError: [Errno 2] No such file or directory: '\\\\svr-dc...'

これの問題点は、実際には zip 内の最初のファイル名が表示されることです。エラーの最後にファイル AJ07242013.PRN が表示されるので、少なくとも zip ファイルの内容を読み取るところまで来ているので、より身近に感じることができます。

私が試みたほとんどすべての反復で、これら 2 つのエラーのいずれか、または構文エラーが発生しますが、これは簡単に対処でき、私の主な関心事ではありません。

長々とすみません。これを機能させたいので、何をする必要があると思うか教えてください。

編集:

そのため、最終的に 7z がパスに追加され、サブプロセスと os.system の両方でエラーなしで実行されています。しかし、私はまだ開梱するものを手に入れることができないようです。Python のドキュメントを読んだ限りでは、subprocess.communicate() モジュールを使用してこのファイルを抽出する必要があるように見えますが、解凍することはできません。os.system を使用すると、アーカイブが見つからないというメッセージが表示され続けます。

import subprocess
cmd = ['7z', 'e']
sp = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

sp.communicate('r"\C:\Users\boster\Desktop\Data1.zip"')

sp.communicate が正しいとは思いませんが、他に何かを追加すると、引数が多すぎます。

4

3 に答える 3

1

Python の zipfile は圧縮タイプ 6 (内破) をサポートしていないため、単純に機能しません。最初のケースでは、それはエラーから明らかです。2 番目のケースでは、事態はさらに悪化します。extractfile のパラメータは、別の解凍ディレクトリです。zip ファイルの名前を指定したため、同じ名前のディレクトリが見つからず、zipfile はサポートされていない問題に到達する前にあきらめます。

コマンド ラインで 7z を使用してこれを実行できることを確認し、subprocess の実装をもう一度試して、必要に応じてその手法に関するヘルプを求めてください。

通常の場所で 7z を検索するスクリプトを次に示します。

import os
import sys
import subprocess
from glob import glob

print 'python version:', sys.version
subprocess.call('ver', shell=True)
print

if os.path.exists(r'C:\Program Files\7-Zip'):
    print 'have standard 7z install'
    if '7-zip' in os.environ['PATH'].lower():
        print '...and its in the path'
    else:
        print '...but its not in the path'
    print

print 'find in path...'
found = 0
for p in os.environ['PATH'].split(os.path.pathsep):
    candidate = os.path.join(p, '7z.*')
    for fn in glob(candidate):
        print '    found', fn
        found += 1
print

if found:
    print '7z located, attempt run'
    subprocess.call(['7z'])
else:
    print '7z not found'
于 2013-07-25T21:11:53.233 に答える
0

ZipFile のドキュメントによると、最初に zip を作業ディレクトリにコピーすることをお勧めします。( http://docs.python.org/2/library/zipfile#zipfile.ZipFile.extract )

コピーに問題がある場合は、スペースを含まないパスに zip を保存するか、os.path を使用してコードをスペースから保護することをお勧めします。

os.path.abspath を使用して小さなテストを行い、zip への適切なパスがあり、適切に機能することを確認しました。また、extractall に指定するパスが、zip コンテンツが抽出されるパスであることを確認してください。(指定されたフォルダーが作成されない場合は、自動的に作成されます) extractall にパラメーターが渡されない場合、ファイルは現在の作業ディレクトリ (CWD) に抽出されます。

乾杯!

于 2013-07-25T21:11:45.943 に答える