我无法从档案中提取Python 3。以下是在Mac OS X上进行的一些调查结果,可能会有所帮助。
检查档案的健康状况
将文件设为只读,以防止意外更改:
$ chmod -w vertnet_latest_amphibians.zip
$ ls -lh vertnet_latest_amphibians.zip
-r--r--r-- 1 lawh 2045336417 296M Jan 6 10:10 vertnet_latest_amphibians.zip
使用 zip
和 unzip
命令来检查归档文件:
$ zip -T vertnet_latest_amphibians.zip
test of vertnet_latest_amphibians.zip OK
$ unzip -t vertnet_latest_amphibians.zip
Archive: vertnet_latest_amphibians.zip
testing: VertNet_Amphibia_eml.xml OK
testing: __MACOSX/ OK
testing: __MACOSX/._VertNet_Amphibia_eml.xml OK
testing: vertnet_latest_amphibians.csv OK
testing: __MACOSX/._vertnet_latest_amphibians.csv OK
No errors detected in compressed data of vertnet_latest_amphibians.zip
正如@sam-mussmann所发现的那样,7z
报告了一个CRC错误:
$ 7z t vertnet_latest_amphibians.zip
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,4 CPUs x64)
Scanning the drive for archives:
1 file, 309726398 bytes (296 MiB)
Testing archive: vertnet_latest_amphibians.zip
--
Path = vertnet_latest_amphibians.zip
Type = zip
Physical Size = 309726398
ERROR: CRC Failed : vertnet_latest_amphibians.csv
Sub items Errors: 1
Archives with Errors: 1
Sub items Errors: 1
我的zip
和unzip
都比较老旧;7z
则是相当新的:
$ zip -v | head -2
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
$ unzip -v | head -1
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
$ 7z --help |head -3
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,4 CPUs x64)
提取
使用 unzip
命令:
$ time unzip vertnet_latest_amphibians.zip vertnet_latest_amphibians.csv
Archive: vertnet_latest_amphibians.zip
inflating: vertnet_latest_amphibians.csv
real 0m17.201s
user 0m14.281s
sys 0m2.460s
为了简洁起见,使用Python 2.7.13版本的zipfile
命令行接口进行提取:
$ time ~/local/python-2.7.13/bin/python2 -m zipfile -e vertnet_latest_amphibians.zip .
real 0m19.491s
user 0m12.996s
sys 0m5.897s
正如您发现的那样,Python 3.6.0(也包括3.4.5和3.5.2)报告了错误的CRC。
假设1:存档文件包含错误的CRC,而zip、unzip和Python 2.7.13未能检测到;7z和Python 3.4-3.6都做得很好。
假设2:存档文件没问题;7z和Python 3.4-3.6都出现了错误。
考虑到这些工具的相对年龄,我猜H1是正确的。
解决方法:
如果您不使用Windows并且信任存档中的内容,则可能更直接地使用常规shell命令。例如:
wget <the-long-url> -O /tmp/vertnet_latest_amphibians.zip
unzip /tmp/vertnet_latest_amphibians.zip vertnet_latest_amphibians.csv
rm -rf /tmp/vertnet_latest_amphibians.zip
或者你可以在Python中执行unzip
:
import os
os.system('unzip vertnet_latest_amphibians.zip vertnet_latest_amphibians.csv')
附带说明
捕获ImportError
比检查Python解释器的版本略微更加简洁:
try:
from urllib.request import urlretrieve
except ImportError:
from urllib import urlretrieve
3.6.0
。我刚刚把它添加到了问题中。 - Ethan White2.7.12
(正常)和3.4.3
(失败)重新创建这个。我现在必须离开,但我已经验证了ZipInfo中的CRC在两个Python版本中是相同的,所以我认为这是CRC32计算的差异。 另外,我的7-zip版本(自2010年以来我没有更新过)也认为这个文件是损坏的。 - Sam Mussmann