解压缩具有深层目录结构的存档时出现Python IOError异常

时间:2012-10-28 22:18:54

标签: python filenames zipfile ioerror

尝试使用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-char限制,这种情况正在发生。 执行cd不是一个选项,大多数路径来自存档本身。 我已经读过“\\?\”前缀,但是将它添加到extractall参数不起作用,它在zipfile模块内的os.mkdir上失败。

使用“\\?\”修复zipfile.py似乎是可能的,但这是一个丑陋的解决方案。

请问任何想法?

2 个答案:

答案 0 :(得分:3)

在Windows上,有一种支持长文件路径的方法。 只需确保您的路径是unicode,绝对路径并添加\\?\前缀。例如:

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

我已经在python 2.7上使用ZipFile类对其进行了测试,它运行良好。

您可以在Windows here上阅读有关文件命名的更多信息。

答案 1 :(得分:0)

我没有必要将路径编码为unicode,但我必须将路径更改为绝对路径,并在此绝对路径之前添加'\\?\'。