我将csv文件压缩成bz2文件,我试图通过网站加载,解压缩并写入本地csv文件
# Get zip file from website
archive = StringIO()
url_data = urllib2.urlopen(url)
archive.write(url_data.read())
# Extract the training data
data = bz2.decompress(archive.read())
# Write to csv
output_file = open('dataset_' + mode + '.csv', 'w')
output_file.write(data)
在解压缩呼叫中,我得到IOError: invalid data stream
。请注意,存档中包含的csv文件有很多字符可能会导致一些问题。特别是,如果我尝试将文件内容放在unicode中,我会收到一条关于无法解码0xfd
的错误。我只在归档文件中包含单个文件,但我想知道是否由于未提取特定文件而导致某些事情发生。
有什么想法吗?
答案 0 :(得分:1)
我怀疑您收到此错误,因为您为decompress()
函数提供的流不是有效的bz2流。
你还必须"倒带"写入后的StringIO
缓冲区。请参阅注释中的以下注释。如果URL指向有效的bz2文件,则以下代码(与您的相同,但导入和seek()
修复除外)都有效。
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)
re:编码问题
通常,字符编码错误会生成UnicodeError
(或其中一个表兄弟),但不会生成IOError
。 IOError
表示输入有问题,例如截断,或者某些错误会阻止解压缩程序完全完成其工作。
您已从您的问题中省略了导入,StringIO
和cStringIO
(根据docs)之间的细微差别之一是cStringIO
无效使用无法转换为ascii的unicode字符串。这似乎不再适用(至少在我的测试中),但它可能正在发挥作用。
与StringIO模块不同,此模块(cStringIO)无法接受无法编码为纯ASCII字符串的Unicode字符串。