Python 3.x StringIO示例不起作用

Python 3.x StringIO示例不起作用,python-3.x,numpy,stringio,Python 3.x,Numpy,Stringio,我试图了解numpy.getfromtxt方法和io.StringIO的工作原理。 在官方网站()上,我找到了一些例子。以下是其中之一: s = StringIO("1,1.3,abcde") data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),('mystring','S5')], delimiter=",") 但当我在我的计算机上运行此代码时,我得到:TypeError:必须是str或None,而不是bytes 请告

我试图了解numpy.getfromtxt方法和io.StringIO的工作原理。 在官方网站()上,我找到了一些例子。以下是其中之一:

s = StringIO("1,1.3,abcde")
data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),('mystring','S5')], delimiter=",")
但当我在我的计算机上运行此代码时,我得到:TypeError:必须是str或None,而不是bytes


请告诉我如何修复它?

考虑升级numpy,因为对于当前版本的
numpy
,您的代码只能按编写的方式工作。有关
np.genfromtxt
中的相关更改,请参阅和部分

对于较旧的numpy,您使用字符串对象作为输入,但链接的文档会显示:

Note that generators must return byte strings in Python 3k. 
因此,按照文档所说的做,并给它一个字节字符串:

import io
s = io.BytesIO(b"1,1.3,abcde")
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')])
这个例子对我很有用:

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')])
或者用几行

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')])

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

[223]中的
:s=“”1,1.3,abcde
…:4,1.3,两个“.”分隔线()
在[224]中:np.genfromtxt(s,dtype=None,delimiter=“,”,encoding=None)
出[224]:
数组([(1,1.3,'abcde'),(4,1.3,'two'),

dtype=[('f0','我甚至可以这样写smth:s=StringIO(“1,1.3,1.4”)data=np.genfromtxt(s,delimiter=“,”))这是最近的一次更改。OP显然有旧版本的numpy。谢谢你的解释,现在这个问题对我来说已经很清楚了。主要的问题是numpy版本。我有点惊讶于
StringIO
起作用了,这就是为什么我包括了版本号。我有一个模糊的记忆,以前我用过它ad使用
BytesIO
。虽然“U5”与“S5”的使用与输入字符串的性质无关,但它与误称的genfromtxt和数据类型“S5”与“U5”中的符号都有点混淆。如果给定文件名
genfromtxt
,则以
rb
模式打开文件,并尝试使用bytestrings(为了与Py2行为保持一致)。最近我看到了
VisibleDepractionWarning
,但忽略了它。这是一个受欢迎的升级。
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')])
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')])
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')])
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')])