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.
Los módulos
StringIO
ycStringIO
se han ido. En su lugar, importe el móduloio
y useio.StringIO
oio.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 mensajeTypeError: 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
.
prueba esto
desde StringIO import StringIO
x = "1 3 / n 4.5 8"
numpy.genfromtxt (StringIO (x))