StringIO en Python3

j'utilise Python 3.2.1 et je ne peux pas importer le module StringIO . J'utilise io.StringIO et ça marche, mais je ne peux pas l'utiliser avec numpy 's genfromtxt comme ceci:

x="1 3n 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'
275
demandé sur Martin Thoma 2012-08-11 15:53:30

7 réponses

quand j'écris import StringIO il dit qu'il n'y a pas de tel module.

à Partir de Ce qui est Nouveau En Python 3.0 :

les modules StringIO et cStringIO ont disparu. Au lieu de cela, importer le io module et utilisez io.StringIO ou io.BytesIO pour le texte et les données respectivement.

.


une méthode peut-être utile pour fixer du code Python 2 pour qu'il fonctionne aussi en Python 3 (caveat emptor):

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

Note: Cet exemple peut être tangent à la question principale de la question et n'est inclus que comme quelque chose à prendre en considération lorsqu'on aborde de façon générique le module manquant StringIO . pour une solution plus directe le message TypeError: Can't convert 'bytes' object to str implicitly , voir cette réponse .

459
répondu nobar 2017-05-23 12:18:25

dans mon cas j'ai utilisé:

from io import StringIO
62
répondu Kamesh Jungi 2017-11-30 15:16:14

sur Python 3 numpy.genfromtxt attend un flux d'octets. Utilisez le texte suivant:

numpy.genfromtxt(io.BytesIO(x.encode()))
55
répondu Roman Shapovalov 2016-04-21 13:23:44

Merci OP pour votre question, et Roman pour votre réponse. J'ai du chercher un peu pour trouver ceci; j'espère que ce qui suit aide les autres.

Python 2.7

voir: 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.]]
"""

à part:

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. ..."

14
répondu Victoria Stuart 2017-05-23 12:34:47

vous pouvez utiliser le StringIO du six module:

import six
import numpy

x = "1 3\n 4.5 8"
numpy.genfromtxt(six.StringIO(x))
11
répondu Tiago Coutinho 2016-05-31 16:04:35

pour faire des exemples de ici travailler avec Python 3.5.2, vous pouvez réécrire comme suit :

import io
data =io.BytesIO(b"1, 2, 3\n4, 5, 6") 
import numpy
numpy.genfromtxt(data, delimiter=",")

La raison du changement est peut-être que le contenu d'un fichier de données (octets) qui ne font pas de texte avant d'être décodé en quelque sorte. genfrombytes peut être un meilleur nom que genfromtxt .

5
répondu Pierre ALBARÈDE 2016-12-19 17:02:52

essayez cette

de StringIO importation StringIO

x= "1 3\n 4.5 8"

numpy.genfromtxt(StringIO (x))

-4
répondu Satheesh Alathiyur 2016-06-08 14:05:58