【问题标题】:pandas.read_csv from string or package datapandas.read_csv 来自字符串或包数据
【发布时间】:2014-01-08 21:27:31
【问题描述】:

我在一个包中有一些 csv 文本数据,我想使用 read_csv 读取这些数据。我是这样做的

from pkgutil import get_data
from StringIO import StringIO

data = read_csv(StringIO(get_data('package.subpackage', 'path/to/data.csv')))

但是,StringIO.StringIO 在 Python 3 中消失了,io.StringIO 只接受 Unicode。有没有简单的方法来做到这一点?

编辑:以下似乎不起作用

import pandas as pd

import pkgutil
from io import StringIO

def get_data_file(pkg, path):
    f = StringIO()
    contents = unicode(pkgutil.get_data('pymc.examples', 'data/wells.dat'))
    f.write(contents)
    return f

wells = get_data_file('pymc.examples', 'data/wells.dat')

data = pd.read_csv(wells, delimiter=' ', index_col='id',
                   dtype={'switch': np.int8})

失败

  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 401, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 209, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 509, in __init__
    self._make_engine(self.engine)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 611, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 893, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "parser.pyx", line 441, in pandas._parser.TextReader.__cinit__ (pandas/src/parser.c:3940)
  File "parser.pyx", line 551, in pandas._parser.TextReader._get_header (pandas/src/parser.c:5096)
pandas._parser.CParserError: Passed header=0 but only 0 lines in file

【问题讨论】:

    标签: python csv python-3.x numpy pandas


    【解决方案1】:

    要将string 传递给pandas read_csv(),您可以使用io.StringIO,即:

    import pandas as pd
    from io import StringIO
    
    df = pd.read_csv(StringIO("csv string..."))
    

    【讨论】:

    • 这也适用于 .dat 文件。我用逗号替换 .dat 文件的空格,然后使用上面的代码将逗号分隔的字符串转换为 pandas df
    • @embulldogs99 你不需要替换空格,只需使用空格作为sep=' '的字段分隔符
    【解决方案2】:

    以下内容在 3.3 中对我有用:

    >>> import numpy as np, pandas as pd
    >>> import io, pkgutil
    >>> wells = pkgutil.get_data('pymc.examples', 'data/wells.dat')
    >>> type(wells)
    <class 'bytes'>
    >>> df = pd.read_csv(io.BytesIO(wells), encoding='utf8', sep=" ", index_col="id", dtype={"switch": np.int8})
    >>> df.head()
        switch  arsenic       dist  assoc  educ
    id                                         
    1        1     2.36  16.826000      0     0
    2        1     0.71  47.321999      0     0
    3        0     2.07  20.966999      0    10
    4        1     1.15  21.486000      0    12
    5        1     1.10  40.874001      1    14
    
    [5 rows x 5 columns]
    

    注意我不得不手动将wells.dat 放在那个位置,所以我不能发誓我正确地复制了它并且没有终端空白,因为我删除了一些。但是传递read_csv 一个BytesIO 对象和一个编码参数应该可以工作。 (实际上,你可能没有它就可以逃脱,但这是一个好习惯。io.TextIOWrapper 可能是另一种选择。)

    【讨论】:

    • 谢谢,我已经知道如何使用 io.StringIO(unicode(wells)),但这似乎更好。
    • 谢谢!这很有帮助。我对如何使用 pd.read_csv 读取 &lt;class 'byte'&gt; 文件感到迷茫
    • 谢谢!我在 post 请求中通过 formdata 上传了 CSV 文件内容。这有效:df = pd.read_csv( io.BytesIO( self.request.files['file1'][0]['body']) )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2021-07-11
    • 2019-03-09
    • 2018-09-08
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多