4

zipfile モジュールの extractall メソッドを使用して zip ファイルを抽出しようとすると、次のエラーが発生します。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\zipfile.py", line 964, in extractall
self.extract(zipinfo, path, pwd)
File "C:\Python27\lib\zipfile.py", line 952, in extract
return self._extract_member(member, path, pwd)
File "C:\Python27\lib\zipfile.py", line 996, in _extract_member
target = file(targetpath, "wb")

IOError: [Errno 2] No such file or directory: 'D:\\GITHUBDB\\C++\\FellowTraveler
_Open-Transactions\\FellowTraveler-Open-Transactions-846a939\\sample-data\\no_ba
skets\\client_data\\purse\\tBy5mL14qSQXCJK7Uz3WlTOKRP9M0JZksA3Eg7EnnQ1\\T1Q3wZWg
eTUoaUvn9m1lzIK5tn5wITlzxzrGNI8qtaV\\CvHGtfOOKzQKL5hFL7J4iF5yAodVKhS1rxPzME5R9XA'

これは、パスに対する Windows の 260 文字の制限が原因で発生しています。cd を実行することはオプションではありません。ほとんどのパスはアーカイブ自体からのものです。「\\?\」プレフィックスについて読みましたが、extractall パラメーターに追加しても機能せず、zipfile モジュール内の os.mkdir で失敗します。

「\\?\」で zipfile.py を修正することは可能ですが、見苦しい解決策です。

アイデアはありますか?

4

2 に答える 2

4

Windows では、長いファイル パスをサポートする方法があります。パスがユニコードで絶対であることを確認し、\\?\プレフィックスを追加してください。例えば:

zip = ZipFile(zip_filename)
zip.extractall(u'\\\\?\\D:\\a_long_path')

Python 2.7のクラスでテストしましたが、ZipFile完全に動作します。

Windows でのファイル命名の詳細については、こちらを参照してください。

于 2014-06-12T08:54:25.173 に答える