Ich verwende Python 3.2.1 und kann das StringIO
Modul nicht importieren . Ich benutze
io.StringIO
und es funktioniert, aber ich kann es nicht mit benutzen numpy
ist genfromtxt
wie folgt aus :
x="1 3\n 4.5 8"
numpy.genfromtxt(io.StringIO(x))
Ich erhalte folgende Fehlermeldung:
TypeError: Can't convert 'bytes' object to str implicitly
und wenn ich schreibe import StringIO
, heißt es
ImportError: No module named 'StringIO'
quelle
TypeError
s (Zeichenfolgenargument erwartet, 'Bytes' erhalten) erhalten können, wenn Sie diese Änderung isoliert vornehmen. Sie müssen Btyes und Str (Unicode) in Python 3 sorgfältig unterscheiden.from io import StringIO
StringIO
ist undfrom io import BytesIO
stattdessen angewendet werden sollte. Habe mich auf Python 3.5 @ eclipse pyDev + win7 x64 getestet. Bitte lassen Sie mich wissen, wenn ich falsch lag, danke.In meinem Fall habe ich verwendet:
quelle
Unter Python 3 wird
numpy.genfromtxt
ein Byte-Stream erwartet. Verwenden Sie Folgendes:quelle
Vielen Dank an OP für Ihre Frage und Roman für Ihre Antwort. Ich musste ein bisschen suchen, um das zu finden; Ich hoffe das Folgende hilft anderen.
Python 2.7
Siehe: https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html
Python 3.5:
Beiseite:
dtype = "| Sx", wobei x = eines von {1, 2, 3, ...}:
dtypes. Unterschied zwischen S1 und S2 in Python
"Die Zeichenfolgen | S1 und | S2 sind Datentypdeskriptoren. Das erste bedeutet, dass das Array Zeichenfolgen der Länge 1 enthält, das zweite Zeichen der Länge 2. ..."
quelle
Sie können den StringIO aus den sechs Modulen verwenden:
quelle
Der Code von Roman Shapovalov sollte sowohl in Python 3.x als auch in Python 2.6 / 2.7 funktionieren. Hier ist es wieder mit dem vollständigen Beispiel:
Ausgabe:
Erklärung für Python 3.x:
numpy.genfromtxt
Nimmt einen Bytestream (ein dateiähnliches Objekt, das anstelle von Unicode als Byte interpretiert wird).io.BytesIO
Nimmt eine Byte-Zeichenfolge und gibt einen Byte-Stream zurück.io.StringIO
Auf der anderen Seite würde eine Unicode-Zeichenfolge verwendet und ein Unicode-Stream zurückgegeben.x
wird ein String-Literal zugewiesen, das in Python 3.x ein Unicode-String ist.encode()
Nimmt die Unicode-Zeichenfolgex
und erstellt daraus eine Byte-Zeichenfolge, wodurchio.BytesIO
ein gültiges Argument angegeben wird.Der einzige Unterschied für Python 2.6 / 2.7 besteht darin, dass
x
es sich um eine Byte-Zeichenfolge handelt (vorausgesetzt, siefrom __future__ import unicode_literals
wird nicht verwendet), die dannencode()
die Byte-Zeichenfolge verwendetx
und trotzdem dieselbe Byte-Zeichenfolge daraus erstellt. Das Ergebnis ist also dasselbe.Da dies eine der beliebtesten Fragen von SO ist
StringIO
, finden Sie hier weitere Erläuterungen zu den Importanweisungen und den verschiedenen Python-Versionen.Hier sind die Klassen, die einen String nehmen und einen Stream zurückgeben:
io.BytesIO
(Python 2.6, 2.7 und 3.x) - Nimmt eine Byte-Zeichenfolge. Gibt einen Bytestream zurück.io.StringIO
(Python 2.6, 2.7 und 3.x) - Nimmt eine Unicode-Zeichenfolge. Gibt einen Unicode-Stream zurück.StringIO.StringIO
(Python 2.x) - Nimmt eine Byte-Zeichenfolge oder eine Unicode-Zeichenfolge. Wenn Byte-String, wird ein Byte-Stream zurückgegeben. Wenn Unicode-Zeichenfolge, wird ein Unicode-Stream zurückgegeben.cStringIO.StringIO
(Python 2.x) - Schnellere Version vonStringIO.StringIO
, kann jedoch keine Unicode-Zeichenfolgen akzeptieren, die Nicht-ASCII-Zeichen enthalten.Beachten Sie, dass
StringIO.StringIO
als importiertfrom StringIO import StringIO
und dann als verwendet wirdStringIO(...)
. Entweder das, oder du tust esimport StringIO
und verwendest es dannStringIO.StringIO(...)
. Der Modulname und der Klassenname sind zufällig identisch. Es ist ähnlichdatetime
so.Was ist zu verwenden, abhängig von Ihren unterstützten Python-Versionen:
Wenn Sie nur Python 3.x unterstützen: Verwenden Sie einfach
io.BytesIO
oderio.StringIO
abhängig davon, mit welcher Art von Daten Sie arbeiten.Wenn Sie sowohl Python 2.6 / 2.7 als auch 3.x unterstützen oder versuchen, Ihren Code von 2.6 / 2.7 auf 3.x umzustellen: Die einfachste Option ist weiterhin die Verwendung von
io.BytesIO
oderio.StringIO
. ObwohlStringIO.StringIO
flexibel ist und daher für 2.6 / 2.7 bevorzugt erscheint, könnte diese Flexibilität Fehler maskieren, die sich in 3.x manifestieren. Zum Beispiel hatte ich Code, der verwendet wurdeStringIO.StringIO
oderio.StringIO
von der Python-Version abhängt, aber ich habe tatsächlich eine Byte-Zeichenfolge übergeben. Als ich zum Testen in Python 3.x kam, schlug dies fehl und musste behoben werden.Ein weiterer Vorteil der Verwendung
io.StringIO
ist die Unterstützung für universelle Newlines. Wenn Sie das Schlüsselwort Argument übergebennewline=''
inio.StringIO
, wird es in der Lage sein , Zeilen aufgeteilt auf alle\n
,\r\n
oder\r
. Ich fand, dassStringIO.StringIO
das besonders auffallen würde\r
.Beachten Sie, dass , wenn Sie importieren
BytesIO
oderStringIO
aussix
, erhalten SieStringIO.StringIO
in Python 2.x und die entsprechende Klasse vonio
in Python 3.x Wenn Sie der Einschätzung meiner vorherigen Absätze zustimmen, ist dies tatsächlich ein Fall, in dem Sie vermeidensix
undio
stattdessen einfach importieren sollten .Wenn Sie Python 2.5 oder niedriger und 3.x unterstützen: Sie benötigen
StringIO.StringIO
2.5 oder niedriger, also können Sie es auch verwendensix
. Beachten Sie jedoch, dass es im Allgemeinen sehr schwierig ist, sowohl 2.5 als auch 3.x zu unterstützen. Daher sollten Sie in Betracht ziehen, Ihre niedrigste unterstützte Version auf 2.6 zu erhöhen, wenn dies überhaupt möglich ist.quelle
Damit Beispiele von hier mit Python 3.5.2 funktionieren, können Sie wie folgt umschreiben:
Der Grund für die Änderung kann sein, dass sich der Inhalt einer Datei in Daten (Bytes) befindet, die erst dann Text erzeugen, wenn sie irgendwie dekodiert wurden.
genfrombytes
kann ein besserer Name sein alsgenfromtxt
.quelle
Versuche dies
aus StringIO StringIO importieren
x = "1 3 \ n 4,5 8"
numpy.genfromtxt (StringIO (x))
quelle