Estou usando o Python 3.2.1 e não consigo importar o StringIO
módulo. Eu uso
io.StringIO
e funciona, mas não posso usá-lo com numpy
o genfromtxt
seguinte:
x="1 3\n 4.5 8"
numpy.genfromtxt(io.StringIO(x))
Estou tendo o erro a seguir:
TypeError: Can't convert 'bytes' object to str implicitly
e quando escrevo import StringIO
diz
ImportError: No module named 'StringIO'
fonte
TypeError
s (argumento de string esperado, obteve 'bytes') se fizer essa alteração isoladamente. Você precisa distinguir cuidadosamente btyes e str (unicode) em python 3.from io import StringIO
StringIO
se foi efrom io import BytesIO
deve ser aplicado. Testei-me em python 3.5 @ eclipse pyDev + win7 x64. Entre em contato se estiver errado, obrigado.No meu caso, eu usei:
fonte
No Python 3,
numpy.genfromtxt
espera-se um fluxo de bytes. Use o seguinte:fonte
Obrigado OP pela sua pergunta e Roman pela sua resposta. Eu tive que procurar um pouco para encontrar isso; Espero que o seguinte ajude outras pessoas.
Python 2.7
Consulte: https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html
Python 3.5:
A parte, de lado:
dtype = "| Sx", em que x = qualquer um dos {1, 2, 3, ...}:
tipos. Diferença entre S1 e S2 em Python
"As strings | S1 e | S2 são descritores de tipo de dados; o primeiro significa que o array contém strings de comprimento 1, o segundo de comprimento 2. ..."
fonte
Você pode usar o StringIO nos seis módulos:
fonte
O código de Roman Shapovalov deve funcionar no Python 3.x e no Python 2.6 / 2.7. Aqui está novamente com o exemplo completo:
Resultado:
Explicação para o Python 3.x:
numpy.genfromtxt
utiliza um fluxo de bytes (um objeto parecido com um arquivo interpretado como bytes em vez de Unicode).io.BytesIO
pega uma sequência de bytes e retorna um fluxo de bytes.io.StringIO
, por outro lado, pegaria uma string Unicode e retornaria um fluxo Unicode.x
recebe uma string literal, que no Python 3.x é uma string Unicode.encode()
pega a string Unicodex
e cria uma string de bytes, fornecendoio.BytesIO
um argumento válido.A única diferença para o Python 2.6 / 2.7 é que
x
é uma sequência de bytes (supondo quefrom __future__ import unicode_literals
não seja usada) e,encode()
em seguida, pega a sequência de bytesx
e ainda cria a mesma sequência de bytes. Então o resultado é o mesmo.Como essa é uma das perguntas mais populares da SO
StringIO
, aqui estão mais algumas explicações sobre as instruções de importação e as diferentes versões do Python.Aqui estão as classes que pegam uma string e retornam um fluxo:
io.BytesIO
(Python 2.6, 2.7 e 3.x) - Aceita uma sequência de bytes. Retorna um fluxo de bytes.io.StringIO
(Python 2.6, 2.7 e 3.x) - utiliza uma string Unicode. Retorna um fluxo Unicode.StringIO.StringIO
(Python 2.x) - Aceita uma sequência de bytes ou Unicode. Se sequência de bytes, retorna um fluxo de bytes. Se sequência Unicode, retorna um fluxo Unicode.cStringIO.StringIO
(Python 2.x) - Versão mais rápidaStringIO.StringIO
, mas não aceita sequências de caracteres Unicode que contêm caracteres não ASCII.Observe que
StringIO.StringIO
é importado comofrom StringIO import StringIO
e usado comoStringIO(...)
. Ou isso, ou você fazimport StringIO
e depois usaStringIO.StringIO(...)
. O nome do módulo e o nome da classe são os mesmos. É semelhante adatetime
esse caminho.O que usar, dependendo das versões suportadas do Python:
Se você suporta apenas o Python 3.x: use
io.BytesIO
ouio.StringIO
dependendo de que tipo de dados você está trabalhando.Se você suporta o Python 2.6 / 2.7 e 3.x, ou está tentando fazer a transição do seu código de 2.6 / 2.7 para 3.x: A opção mais fácil ainda é usar
io.BytesIO
ouio.StringIO
. EmboraStringIO.StringIO
seja flexível e, portanto, pareça preferível para 2.6 / 2.7, essa flexibilidade pode mascarar os erros que se manifestarão na 3.x. Por exemplo, eu tinha algum código que usavaStringIO.StringIO
ouio.StringIO
dependia da versão do Python, mas na verdade estava passando uma sequência de bytes, por isso, quando comecei a testá-lo no Python 3.x, ele falhou e teve que ser corrigido.Outra vantagem do uso
io.StringIO
é o suporte para novas linhas universais. Se você passar a palavra-chave argumentonewline=''
paraio.StringIO
, ele será capaz de dividir as linhas em qualquer um\n
,\r\n
ou\r
. Eu descobri que issoStringIO.StringIO
iria tropeçar\r
em particular.Observe que, se você importar
BytesIO
ouStringIO
desix
, entraStringIO.StringIO
no Python 2.xe a classe apropriadaio
no Python 3.x. Se você concorda com a avaliação dos parágrafos anteriores, esse é realmente um caso em que você deve evitarsix
e apenas importario
.Se você suporta Python 2.5 ou inferior e 3.x: você precisará
StringIO.StringIO
de 2.5 ou inferior, então você pode usá-losix
. Mas saiba que geralmente é muito difícil oferecer suporte tanto ao 2.5 quanto ao 3.x, portanto, você deve considerar elevar sua versão mais baixa suportada para 2.6, se possível.fonte
Para fazer com que os exemplos daqui funcionem com o Python 3.5.2, você pode reescrever da seguinte maneira:
O motivo da alteração pode ser que o conteúdo de um arquivo esteja em dados (bytes) que não produzem texto até serem decodificados de alguma forma.
genfrombytes
pode ser um nome melhor quegenfromtxt
.fonte
tente isso
de StringIO import StringIO
x = "1 3 \ n 4,5 8"
numpy.genfromtxt (StringIO (x))
fonte