J'utilise Python 3.2.1 et je ne peux pas importer le StringIO
module. Je l' utilise
io.StringIO
et il fonctionne, mais je ne peux pas l' utiliser avec numpy
« s genfromtxt
comme celui - ci:
x="1 3\n 4.5 8"
numpy.genfromtxt(io.StringIO(x))
J'obtiens l'erreur suivante:
TypeError: Can't convert 'bytes' object to str implicitly
et quand j'écris import StringIO
ça dit
ImportError: No module named 'StringIO'
la source
TypeError
s (argument de chaîne attendu, obtenu «octets») si vous effectuez cette modification de manière isolée. Vous devez soigneusement distinguer les btyes et les str (unicode) en python 3.from io import StringIO
StringIO
disparu etfrom io import BytesIO
doit être appliqué à la place. Je me suis testé sur python 3.5 @ eclipse pyDev + win7 x64. S'il vous plaît laissez-moi savoir si je me suis trompé merci.Dans mon cas, j'ai utilisé:
la source
Sur Python 3
numpy.genfromtxt
attend un flux d'octets. Utilisez le suivant:la source
Merci OP pour votre question et Roman pour votre réponse. J'ai dû chercher un peu pour trouver cela; J'espère que ce qui suit aide les autres.
Python 2.7
Voir: https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html
Python 3.5:
De côté:
dtype = "| Sx", où x = l'un des {1, 2, 3, ...}:
dtypes. Différence entre S1 et S2 en Python
"Les chaînes | S1 et | S2 sont des descripteurs de type de données; la première signifie que le tableau contient des chaînes de longueur 1, la seconde de longueur 2. ..."
la source
Vous pouvez utiliser le StringIO à partir des six modules:
la source
Le code de Roman Shapovalov devrait fonctionner aussi bien en Python 3.x qu'en Python 2.6 / 2.7. Le voici à nouveau avec l'exemple complet:
Production:
Explication pour Python 3.x:
numpy.genfromtxt
prend un flux d'octets (un objet de type fichier interprété comme des octets au lieu d'Unicode).io.BytesIO
prend une chaîne d'octets et retourne un flux d'octets.io.StringIO
, d'autre part, prendrait une chaîne Unicode et retournerait un flux Unicode.x
obtient un littéral de chaîne, qui dans Python 3.x est une chaîne Unicode.encode()
prend la chaîne Unicodex
et en fait une chaîne d'octets, donnant ainsiio.BytesIO
un argument valide.La seule différence pour Python 2.6 / 2.7 est qu'il
x
s'agit d'une chaîne d'octets (en supposant qu'ellefrom __future__ import unicode_literals
n'est pas utilisée), puisencode()
prend la chaîne d'octetsx
et en fait toujours la même chaîne d'octets. Le résultat est donc le même.Comme il s'agit de l'une des questions les plus populaires de SO
StringIO
, voici quelques explications supplémentaires sur les instructions d'importation et les différentes versions de Python.Voici les classes qui prennent une chaîne et retournent un flux:
io.BytesIO
(Python 2.6, 2.7 et 3.x) - Prend une chaîne d'octets. Renvoie un flux d'octets.io.StringIO
(Python 2.6, 2.7 et 3.x) - Prend une chaîne Unicode. Renvoie un flux Unicode.StringIO.StringIO
(Python 2.x) - Prend une chaîne d'octets ou une chaîne Unicode. Si chaîne d'octets, retourne un flux d'octets. Si chaîne Unicode, renvoie un flux Unicode.cStringIO.StringIO
(Python 2.x) - Version plus rapide deStringIO.StringIO
, mais ne peut pas accepter des chaînes Unicode qui contiennent des caractères non ASCII.Notez qu'il
StringIO.StringIO
est importé en tant quefrom StringIO import StringIO
, puis utilisé en tant queStringIO(...)
. Soit cela, soit vous le faitesimport StringIO
, puis vous l'utilisezStringIO.StringIO(...)
. Il se trouve que le nom du module et le nom de la classe sont identiques. C'est commedatetime
ça.Ce qu'il faut utiliser, selon les versions de Python prises en charge:
Si vous ne supportez que Python 3.x: utilisez simplement
io.BytesIO
ouio.StringIO
selon le type de données avec lesquelles vous travaillez.Si vous prenez en charge Python 2.6 / 2.7 et 3.x, ou essayez de faire passer votre code de 2.6 / 2.7 à 3.x: l' option la plus simple est toujours d'utiliser
io.BytesIO
ouio.StringIO
. Bien qu'elleStringIO.StringIO
soit flexible et semble donc préférée pour 2.6 / 2.7, cette flexibilité pourrait masquer les bogues qui se manifesteront dans 3.x. Par exemple, j'avais du code qui utilisaitStringIO.StringIO
ouio.StringIO
dépendait de la version de Python, mais je passais en fait une chaîne d'octets, donc quand je me suis mis à le tester dans Python 3.x, il a échoué et a dû être corrigé.Un autre avantage de l'utilisation
io.StringIO
est la prise en charge des sauts de ligne universels. Si vous passez l'argument mot - clénewline=''
dansio.StringIO
, il sera en mesure de diviser des lignes sur l' une\n
,\r\n
ou\r
. J'ai trouvé queStringIO.StringIO
cela se déclencherait\r
en particulier.Notez que si vous importez
BytesIO
ou àStringIO
partir desix
, vous obtenezStringIO.StringIO
dans Python 2.x et la classe appropriéeio
dans Python 3.x. Si vous êtes d'accord avec l'évaluation de mes paragraphes précédents, il s'agit en fait d'un cas dans lequel vous devriez évitersix
et simplement importer à laio
place.Si vous prenez en charge Python 2.5 ou inférieur et 3.x: vous aurez besoin
StringIO.StringIO
de 2.5 ou inférieur, vous pouvez donc aussi bien l'utilisersix
. Mais sachez qu'il est généralement très difficile de prendre en charge les versions 2.5 et 3.x, vous devriez donc envisager de transférer votre version prise en charge la plus basse vers 2.6 si possible.la source
Pour que les exemples d' ici fonctionnent avec Python 3.5.2, vous pouvez réécrire comme suit:
La raison de la modification peut être que le contenu d'un fichier se trouve dans des données (octets) qui ne font pas de texte avant d'être décodées d'une manière ou d'une autre.
genfrombytes
peut être un meilleur nom quegenfromtxt
.la source
essaye ça
depuis StringIO import StringIO
x = "1 3 \ n 4,5 8"
numpy.genfromtxt (StringIO (x))
la source