我怀疑您收到此错误是因为您提供decompress()
函数的流不是有效的 bz2 流。
您还必须StringIO
在写入缓冲区后“倒回”缓冲区。请参阅下面的注释中的注释。seek()
如果 URL 指向有效的 bz2 文件,则以下代码(与您的代码相同,但导入和修复除外)有效。
from StringIO import StringIO
import urllib2
import bz2
# Get zip file from website
url = "http://www.7-zip.org/a/7z920.tar.bz2" # just an example bz2 file
archive = StringIO()
# in case the request fails (e.g. 404, 500), this will raise
# a `urllib2.HTTPError`
url_data = urllib2.urlopen(url)
archive.write(url_data.read())
# will print how much compressed data you have buffered.
print "Length of file:", archive.tell()
# important!... make sure to reset the file descriptor read position
# to the start of the file.
archive.seek(0)
# Extract the training data
data = bz2.decompress(archive.read())
# Write to csv
output_file = open('output_file', 'w')
output_file.write(data)
回复:编码问题
通常,字符编码错误会生成UnicodeError
(或其表亲之一),但不会生成IOError
. IOError
表明输入有问题,例如截断,或者某些错误会阻止解压缩器完全完成其工作。
您已经从问题中省略了导入,StringIO
and cStringIO
(根据文档)之间的细微差别之一是cStringIO
不能使用无法转换为 ascii 的 unicode 字符串。这似乎不再成立(至少在我的测试中),但它可能正在发挥作用。
与 StringIO 模块不同,此模块 (cStringIO) 无法接受无法编码为纯 ASCII 字符串的 Unicode 字符串。