pandas.read_csv 来自字符串或包数据
Posted
技术标签:
【中文标题】pandas.read_csv 来自字符串或包数据【英文标题】:pandas.read_csv from string or package data 【发布时间】: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
【问题讨论】:
【参考方案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
读取 <class 'byte'>
文件感到迷茫
谢谢!我在 post 请求中通过 formdata 上传了 CSV 文件内容。这有效:df = pd.read_csv( io.BytesIO( self.request.files['file1'][0]['body']) )
以上是关于pandas.read_csv 来自字符串或包数据的主要内容,如果未能解决你的问题,请参考以下文章
Python,pandas.read_csv 来自 Google Drive 文件的 1000 万行大型 csv 文件
来自文件夹嵌套 Zip 文件的 pandas read_csv 的 UnicodeDecodeError ('utf-8')
获取 pandas.read_csv 以将空值读取为空字符串而不是 nan
pandas.read_csv 将字符串转换为科学记数法中的“数字”(我不想要)