首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringIO示例不工作

StringIO示例不工作
EN

Stack Overflow用户
提问于 2018-02-10 17:02:49
回答 2查看 1.1K关注 0票数 3

我试图了解numpy.getfromtxt方法和io.StringIO是如何工作的。我在官网(https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.genfromtxt.html#numpy.genfromtxt)上找到了一些例子。以下是其中之一:

代码语言:javascript
复制
s = StringIO("1,1.3,abcde")
data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),('mystring','S5')], delimiter=",")

但是,当我在我的计算机上运行这段代码时,我得到: TypeError:必须是str或空,而不是字节

请告诉我怎么修理它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-10 17:11:05

代码语言:javascript
复制
In [200]: np.__version__
Out[200]: '1.14.0'

这个例子适用于我:

代码语言:javascript
复制
In [201]: s = io.StringIO("1,1.3,abcde")
In [202]: np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
     ...: ... ('mystring','S5')], delimiter=",")
Out[202]: 
array((1, 1.3, b'abcde'),
      dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])

它也适用于字节字符串:

代码语言:javascript
复制
In [204]: s = io.BytesIO(b"1,1.3,abcde")
In [205]: np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
     ...: ... ('mystring','S5')], delimiter=",")
Out[205]: 
array((1, 1.3, b'abcde'),
      dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])

genfromtxt适用于任何输入其行的内容,因此我通常直接使用字节串列表(当测试问题时):

代码语言:javascript
复制
In [206]: s = [b"1,1.3,abcde"]
In [207]: np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
     ...: ... ('mystring','S5')], delimiter=",")
Out[207]: 
array((1, 1.3, b'abcde'),
      dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])

或者有几行

代码语言:javascript
复制
In [208]: s = b"""1,1.3,abcde
     ...: 4,1.3,two""".splitlines()
In [209]: s
Out[209]: [b'1,1.3,abcde', b'4,1.3,two']
In [210]: np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
     ...: ... ('mystring','S5')], delimiter=",")
Out[210]: 
array([(1, 1.3, b'abcde'), (4, 1.3, b'two')],
      dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', 'S5')])

过去使用dtype=Nonegenfromtxt创建了S字符串。

NumPy dtype问题在genfromtxt()中,将字符串读入为字节串

使用1.14,我们可以控制默认的字符串dtype:

代码语言:javascript
复制
In [219]: s = io.StringIO("1,1.3,abcde")
In [220]: np.genfromtxt(s, dtype=None, delimiter=",")
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default.
  #!/usr/bin/python3
Out[220]: 
array((1, 1.3, b'abcde'),
      dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', 'S5')])
In [221]: s = io.StringIO("1,1.3,abcde")
In [222]: np.genfromtxt(s, dtype=None, delimiter=",",encoding=None)
Out[222]: 
array((1, 1.3, 'abcde'),
      dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '<U5')])

https://docs.scipy.org/doc/numpy/release.html#encoding-argument-for-text-io-functions

现在,我可以用Py3字符串生成示例,而不必生成所有丑陋的b'string'结果(但要记住,并非每个人都升级到1.14):

代码语言:javascript
复制
In [223]: s = """1,1.3,abcde
     ...: 4,1.3,two""".splitlines()
In [224]: np.genfromtxt(s, dtype=None, delimiter=",",encoding=None)
Out[224]: 
array([(1, 1.3, 'abcde'), (4, 1.3, 'two')],
      dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '<U5')])
票数 1
EN

Stack Overflow用户

发布于 2018-02-10 17:06:12

考虑升级numpy,因为对于当前版本的numpy,您的代码只是按编写的方式工作。有关1.14.0发布说明中提到的重点的相关更改,请参阅np.genfromtxt文本IO函数的编码参数一节。

对于较老的numpy,输入使用string对象,但链接的文档如下:

代码语言:javascript
复制
Note that generators must return byte strings in Python 3k. 

那么,按照文档的话做,并给它一个字节字符串:

代码语言:javascript
复制
import io
s = io.BytesIO(b"1,1.3,abcde")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48723311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档