【问题标题】:Python Decompressing gzip csv in pandas csv readerPython在pandas csv阅读器中解压gzip csv
【发布时间】:2018-06-05 13:07:18
【问题描述】:

以下代码在 Python3 中有效,但在 Python2 中失败

r = requests.get("http://api.bitcoincharts.com/v1/csv/coinbaseUSD.csv.gz", stream=True)
decompressed_file = gzip.GzipFile(fileobj=r.raw)
data = pd.read_csv(decompressed_file, sep=',')
data.columns = ["timestamp", "price" , "volume"]  # set df col headers
return data

我在 Python2 中遇到的错误如下:

TypeError: 'int' object has no attribute '__getitem__'

错误出现在我设置数据等于 pd.read_csv(...) 的那一行

对我来说似乎是熊猫错误

堆栈跟踪:

Traceback (most recent call last):
  File "fetch.py", line 51, in <module>
    print(f.get_historical())
  File "fetch.py", line 36, in get_historical
    data = pd.read_csv(f, sep=',')
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 709, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 449, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 818, in __init__
    self._make_engine(self.engine)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1049, in _make_engine

    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1695, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas/_libs/parsers.pyx", line 562, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas/_libs/parsers.pyx", line 760, in pandas._libs.parsers.TextReader._get_header
  File "pandas/_libs/parsers.pyx", line 965, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas/_libs/parsers.pyx", line 2197, in pandas._libs.parsers.raise_parser_error
io.UnsupportedOperation: seek

【问题讨论】:

  • 我无法在 python2 上重现此错误。请提供完整的回溯,以便我们可以查看此问题的确切根源。我只能说某处正在尝试索引int,而这正是TypeError 异常所抱怨的。
  • 始终将完整的 Traceback 放在 qiestion 中。还有其他有用的信息。
  • 你可以显示 decompressed_file 看看你得到了什么
  • @Abdou 堆栈跟踪已更新

标签: python python-2.7 pandas python-requests gzip


【解决方案1】:

您发布的回溯问题与Response 对象的原始属性是不支持典型文件对象支持的.seek 方法的类文件对象有关。但是,当使用 pd.read_csv 摄取文件对象时,pandas(在 python2 中)似乎正在使用所提供文件对象的 seek 方法。

您可以通过调用r.raw.seekable() 来确认返回的响应的原始数据不可搜索,通常应该返回False

规避此问题的方法可能是将返回的数据包装成io.BytesIO对象,如下所示:

import gzip
import io
import pandas as pd
import requests

# file_url = "http://api.bitcoincharts.com/v1/csv/coinbaseUSD.csv.gz"
file_url = "http://api.bitcoincharts.com/v1/csv/aqoinEUR.csv.gz"
r = requests.get(file_url, stream=True)
dfile = gzip.GzipFile(fileobj=io.BytesIO(r.raw.read()))
data = pd.read_csv(dfile, sep=',')

print(data)

            0     1    2
0  1314964052  2.60  0.4
1  1316277154  3.75  0.5
2  1316300526  4.00  4.0
3  1316300612  3.80  1.0
4  1316300622  3.75  1.5

如您所见,我使用了可用文件目录中的一个较小的文件。您可以将其切换到您想要的文件。 无论如何,io.BytesIO(r.raw.read()) 应该是可搜索的,因此应该有助于避免您遇到的 io.UnsupportedOperation 异常。

至于TypeError异常,在这段sn-p代码中是不存在的。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2012-02-28
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多