type textiowrapper has got fileio expected bytes attribute argument _io python numpy python-3.x io python-3.2

python - has - textiowrapper to string



StringIO en Python3 (7)

Estoy usando Python 3.2.1 y no puedo importar el módulo StringIO . Uso io.StringIO y funciona, pero no puedo usarlo con el numpy de genfromtxt como este:

x="1 3/n 4.5 8" numpy.genfromtxt(io.StringIO(x))

Obtuve el siguiente error:

TypeError: Can''t convert ''bytes'' object to str implicitly

y cuando escribo import StringIO dice

ImportError: No module named ''StringIO''


cuando escribo importación StringIO dice que no hay tal módulo.

De lo nuevo en Python 3.0 :

Los módulos StringIO y cStringIO se han ido. En su lugar, importe el módulo io y use io.StringIO o io.BytesIO para texto y datos respectivamente.

.

Un método posiblemente útil para corregir algunos códigos Python 2 para que funcionen también en Python 3 (caveat emptor):

try: from StringIO import StringIO except ImportError: from io import StringIO

Nota: este ejemplo puede ser tangencial al problema principal de la pregunta y se incluye solo como algo a tener en cuenta al abordar genéricamente el módulo StringIO faltante. Para una solución más directa, el mensaje TypeError: Can''t convert ''bytes'' object to str implicitly , vea esta respuesta .


En Python 3, numpy.genfromtxt espera un flujo de bytes. Usa lo siguiente:

numpy.genfromtxt(io.BytesIO(x.encode()))


En mi caso he utilizado:

from io import StringIO


Gracias OP por tu pregunta, y Roman por tu respuesta. Tuve que buscar un poco para encontrar esto; Espero que lo siguiente ayude a otros.

Python 2.7

Consulte: https://docs.scipy.org/doc/numpy-dev/user/basics.io.genfromtxt.html

import numpy as np from StringIO import StringIO data = "1, abc , 2/n 3, xxx, 4" print type(data) """ <type ''str''> """ print ''/n'', np.genfromtxt(StringIO(data), delimiter=",", dtype="|S3", autostrip=True) """ [[''1'' ''abc'' ''2''] [''3'' ''xxx'' ''4'']] """ print ''/n'', type(data) """ <type ''str''> """ print ''/n'', np.genfromtxt(StringIO(data), delimiter=",", autostrip=True) """ [[ 1. nan 2.] [ 3. nan 4.]] """

Python 3.5:

import numpy as np from io import StringIO import io data = "1, abc , 2/n 3, xxx, 4" #print(data) """ 1, abc , 2 3, xxx, 4 """ #print(type(data)) """ <class ''str''> """ #np.genfromtxt(StringIO(data), delimiter=",", autostrip=True) # TypeError: Can''t convert ''bytes'' object to str implicitly print(''/n'') print(np.genfromtxt(io.BytesIO(data.encode()), delimiter=",", dtype="|S3", autostrip=True)) """ [[b''1'' b''abc'' b''2''] [b''3'' b''xxx'' b''4'']] """ print(''/n'') print(np.genfromtxt(io.BytesIO(data.encode()), delimiter=",", autostrip=True)) """ [[ 1. nan 2.] [ 3. nan 4.]] """

Aparte:

dtype = "| Sx", donde x = cualquiera de {1, 2, 3, ...}:

dtypes. Diferencia entre S1 y S2 en Python

"Las cadenas | S1 y | S2 son descriptores de tipo de datos; el primero significa que la matriz contiene cadenas de longitud 1, la segunda de longitud 2. ..."


Para que los ejemplos de here funcionen con Python 3.5.2, puede volver a escribir de la siguiente manera:

import io data =io.BytesIO(b"1, 2, 3/n4, 5, 6") import numpy numpy.genfromtxt(data, delimiter=",")

El motivo del cambio puede ser que el contenido de un archivo está en datos (bytes) que no forman texto hasta que se decodifican de alguna manera. genfrombytes puede ser un nombre mejor que genfromtxt .


Puedes usar el StringIO desde el módulo six :

import six import numpy x = "1 3/n 4.5 8" numpy.genfromtxt(six.StringIO(x))


prueba esto

desde StringIO import StringIO

x = "1 3 / n 4.5 8"

numpy.genfromtxt (StringIO (x))