Estoy usando Python 3.2.1 y no puedo importar el StringIO
módulo. Yo uso
io.StringIO
y funciona, pero no puedo usarlo con numpy
's 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'
fuente
TypeError
s (se espera un argumento de cadena, obtuvo 'bytes') si realiza este cambio de forma aislada. Debe distinguir cuidadosamente btyes y str (unicode) en python 3.from io import StringIO
StringIO
desapareció yfrom io import BytesIO
debería aplicarse en su lugar. Probado en python 3.5 @ eclipse pyDev + win7 x64. Por favor, avíseme si me equivoqué, gracias.En mi caso he usado:
fuente
En Python 3
numpy.genfromtxt
espera una secuencia de bytes. Use lo siguiente:fuente
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
Ver: https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html
Python 3.5:
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. ..."
fuente
Puede usar el StringIO desde los seis módulos:
fuente
El código de Roman Shapovalov debería funcionar en Python 3.x y Python 2.6 / 2.7. Aquí está de nuevo con el ejemplo completo:
Salida:
Explicación para Python 3.x:
numpy.genfromtxt
toma una secuencia de bytes (un objeto similar a un archivo interpretado como bytes en lugar de Unicode).io.BytesIO
toma una cadena de bytes y devuelve una secuencia de bytes.io.StringIO
, por otro lado, tomaría una cadena Unicode y devolvería una secuencia Unicode.x
se le asigna un literal de cadena, que en Python 3.x es una cadena Unicode.encode()
toma la cadena Unicodex
y crea una cadena de bytes, dando asíio.BytesIO
un argumento válido.La única diferencia para Python 2.6 / 2.7 es que
x
es una cadena de bytes (suponiendofrom __future__ import unicode_literals
que no se use), y luegoencode()
toma la cadena de bytesx
y aún hace la misma cadena de bytes. Entonces el resultado es el mismo.Como esta es una de las preguntas más populares sobre SO
StringIO
, aquí hay más explicaciones sobre las declaraciones de importación y las diferentes versiones de Python.Estas son las clases que toman una cadena y devuelven una secuencia:
io.BytesIO
(Python 2.6, 2.7 y 3.x): toma una cadena de bytes. Devuelve una secuencia de bytes.io.StringIO
(Python 2.6, 2.7 y 3.x): toma una cadena Unicode. Devuelve una secuencia Unicode.StringIO.StringIO
(Python 2.x): toma una cadena de bytes o una cadena Unicode. Si la cadena de bytes, devuelve una secuencia de bytes. Si es una cadena Unicode, devuelve una secuencia Unicode.cStringIO.StringIO
(Python 2.x): versión más rápida deStringIO.StringIO
, pero no puede tomar cadenas Unicode que contengan caracteres no ASCII.Tenga en cuenta que
StringIO.StringIO
se importa comofrom StringIO import StringIO
, luego se usa comoStringIO(...)
. O eso, o lo hacesimport StringIO
y luego lo usasStringIO.StringIO(...)
. El nombre del módulo y el nombre de la clase son los mismos. Es similar adatetime
eso.Qué usar, dependiendo de sus versiones de Python compatibles:
Si solo es compatible con Python 3.x: simplemente use
io.BytesIO
oio.StringIO
dependiendo de qué tipo de datos esté trabajando.Si es compatible con Python 2.6 / 2.7 y 3.x, o está tratando de hacer la transición de su código de 2.6 / 2.7 a 3.x: la opción más fácil aún es usar
io.BytesIO
oio.StringIO
. AunqueStringIO.StringIO
es flexible y, por lo tanto, parece preferible para 2.6 / 2.7, esa flexibilidad podría enmascarar errores que se manifestarán en 3.x. Por ejemplo, tenía un código que usabaStringIO.StringIO
oio.StringIO
dependía de la versión de Python, pero en realidad estaba pasando una cadena de bytes, así que cuando pude probarlo en Python 3.x falló y tuve que arreglarlo.Otra ventaja de usar
io.StringIO
es el soporte para líneas nuevas universales. Si pasa el argumento de palabra clavenewline=''
enio.StringIO
, será capaz de dividir las líneas en cualquiera de\n
,\r\n
o\r
. Descubrí queStringIO.StringIO
tropezaría\r
en particular.Tenga en cuenta que si importa
BytesIO
oStringIO
desdesix
, obtieneStringIO.StringIO
Python 2.xy la clase apropiadaio
en Python 3.x. Si está de acuerdo con la evaluación de mis párrafos anteriores, este es realmente un caso en el que debe evitarsix
y simplemente importar desde suio
lugar.Si es compatible con Python 2.5 o inferior y 3.x: necesitará
StringIO.StringIO
2.5 o inferior, por lo que podría usarlosix
. Pero tenga en cuenta que, en general, es muy difícil admitir 2.5 y 3.x, por lo que debería considerar subir su versión más baja a 2.6 si es posible.fuente
Para que los ejemplos de aquí funcionen con Python 3.5.2, puede volver a escribir de la siguiente manera:
La razón 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 mejor nombre quegenfromtxt
.fuente
prueba esto
de StringIO importar StringIO
x = "1 3 \ n 4.5 8"
numpy.genfromtxt (StringIO (x))
fuente