Estoy usando Python 3.2.1 y no puedo importar el StringIOmódulo. Yo uso
io.StringIOy funciona, pero no puedo usarlo con numpy's genfromtxtcomo 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 StringIOdice
ImportError: No module named 'StringIO'
fuente

TypeErrors (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 StringIOStringIOdesapareció yfrom io import BytesIOdeberí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.genfromtxtespera 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.genfromtxttoma una secuencia de bytes (un objeto similar a un archivo interpretado como bytes en lugar de Unicode).io.BytesIOtoma 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.xse le asigna un literal de cadena, que en Python 3.x es una cadena Unicode.encode()toma la cadena Unicodexy crea una cadena de bytes, dando asíio.BytesIOun argumento válido.La única diferencia para Python 2.6 / 2.7 es que
xes una cadena de bytes (suponiendofrom __future__ import unicode_literalsque no se use), y luegoencode()toma la cadena de bytesxy 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.StringIOse importa comofrom StringIO import StringIO, luego se usa comoStringIO(...). O eso, o lo hacesimport StringIOy luego lo usasStringIO.StringIO(...). El nombre del módulo y el nombre de la clase son los mismos. Es similar adatetimeeso.Qué usar, dependiendo de sus versiones de Python compatibles:
Si solo es compatible con Python 3.x: simplemente use
io.BytesIOoio.StringIOdependiendo 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.BytesIOoio.StringIO. AunqueStringIO.StringIOes 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.StringIOoio.StringIOdependí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.StringIOes 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\no\r. Descubrí queStringIO.StringIOtropezaría\ren particular.Tenga en cuenta que si importa
BytesIOoStringIOdesdesix, obtieneStringIO.StringIOPython 2.xy la clase apropiadaioen 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 evitarsixy simplemente importar desde suiolugar.Si es compatible con Python 2.5 o inferior y 3.x: necesitará
StringIO.StringIO2.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.
genfrombytespuede ser un mejor nombre quegenfromtxt.fuente
prueba esto
de StringIO importar StringIO
x = "1 3 \ n 4.5 8"
numpy.genfromtxt (StringIO (x))
fuente