Mai mult
StringIO în Python3
Eu sunt, folosind Python 3.2.1 și nu pot't importa StringIO
module. Eu folosesc
io.StringIO
și funcționează, dar nu pot't folosi cu numpy
's genfromtxt
astfel:
x="1 3\n 4.5 8"
numpy.genfromtxt(io.StringIO(x))
I a lua următoarea eroare:
TypeError: Can't convert 'bytes' object to str implicitly
și când scriu import StringIO
se spune
ImportError: No module named 'StringIO'
400
8
De Ce este Nou În Python 3.0:
.
Un eventual utile metoda de stabilire a unor Python 2 cod pentru a lucra, de asemenea, în Python 3 (caveat emptor):
În cazul meu, am folosit:
Pe Python 3
numpy.genfromtxt
se așteaptă la un flux de octeți. Utilizați următoarele:Multumesc OP pentru intrebarea ta, și Roman pentru răspunsul dumneavoastră. Am avut pentru a căuta un pic pentru a găsi acest lucru; sper că următoarele ajută pe alții.
Python 2.7
A se vedea: https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html
Python 3.5:
O parte:
dtype="|Sx", unde x = oricare dintre { 1, 2, 3, ...}:
https://stackoverflow.com/questions/14790130/dtypes-difference-between-s1-and-s2-in-python
" |S1 și |S2 siruri de caractere sunt date de tip descriptori; prima înseamnă matrice deține siruri de caractere de lungime 1, al doilea de lungime 2. ..."
Puteți utiliza StringIO de la șase modulul:
Roman Shapovalov's cod ar trebui să lucreze în Python 3.x, precum Python 2.6/2.7. Aici este din nou cu complet exemplu:
Ieșire:
Explicație pentru Python 3.x:
numpy.genfromtxt
nevoie de un flux de octeți (un fișier ca obiect interpretat ca octeți în loc de Unicode).io.BytesIO
nevoie de un octet string și returnează un flux de octeți.io.StringIO
, pe de altă parte, ar lua un șir Unicode și și să se întoarcă un Unicode stream.encode()
ia Unicode string " x " și face un octet string afară de ea, astfel, daio.BytesIO
un argument valid.Singura diferență pentru Python 2.6/2.7 este că " x "este un octet string (presupunând din viitoarele import unicode_literals
nu este folosit), și, apoi, pentru a codifica()
ia octet string" x " și încă face același octet string din ea. Deci, rezultatul este același.Deoarece aceasta este una dintre ATÂT de's cele mai populare întrebări cu privire la
StringIO
, aici's o explicație mai multe pe declarații de import și diferite Python versiuni.Aici sunt clase care ia un șir de caractere și să se întoarcă un flux:
io.BytesIO
(Python 2.6, 2.7, și 3.x) - Nevoie de un octet string. Returnează un flux de octeți.io.StringIO
(Python 2.6, 2.7, și 3.x) - Are un șir Unicode. Returnează un Unicode stream.StringIO.StringIO
(Python 2.x) - Nevoie de un octet string sau Unicode string. Dacă octet de coarde, returnează un flux de octeți. Dacă Unicode string, returnează un Unicode stream.cStringIO.StringIO
(Python 2.x) - versiune mai Rapidă de StringIO.StringIO`, dar poate't ia siruri de caractere Unicode care conțin caractere non-ASCII.Rețineți că
StringIO.StringIO
este importat ca de StringIO import StringIO, apoi folosit ca
StringIO(...). Ori asta, ori te faci import StringIO
și de a folosi apoiStringIO.StringIO(...)
. Modulul nume și nume de clasă doar se întâmplă să fie același. L's similare pentru a "datetime" așa.Ce să folosească, în funcție de susținut Python versiuni:
Dacă aveți doar suport Python 3.x: utilizați Doar
io.BytesIO " sau " io.StringIO
în funcție de ce fel de date're de lucru cu.Dacă vă sprijini atât Python 2.6/2.7 si 3.x, sau încearcă să tranziție codul de 2.6/2.7-3.x: Cea mai simplă opțiune este de a utiliza
io.BytesIO " sau " io.StringIO
. DeșiStringIO.StringIO
este flexibil și, prin urmare, pare de preferat pentru 2.6/2.7, că flexibilitatea ar putea masca de bug-uri, care se vor manifesta în 3.x. De exemplu, am avut un cod care a folositStringIO.StringIO " sau " io.StringIO
în funcție de versiunea Python, dar eu chiar am fost in trecere un octet de coarde, așa că atunci când am ajuns în jurul să-l testeze în Python 3.x nu a reușit și a trebuit să fie reparat.Un alt avantaj al folosind
io.StringIO
este suportul universal pentru linii noi. Dacă treci de cuvinte cheie argumentnewline=''
înio.StringIO
, va fi capabil de a împărți liniile de pe orice de\n
,\r\n
, sau\r
. Am constatat căStringIO.StringIO
ar excursie până la\r
, în special.Rețineți că, dacă aveți de import
BytesIO " sau " StringIO
deșase
, teStringIO.StringIO în Python 2.x și clasa corespunzătoare de
ioîn Python 3.x. Dacă sunteți de acord cu alineatele anterioare' de evaluare, aceasta este de fapt un caz în care ar trebui să evite "șase" și de import de la
io` în loc.În scopul de a face exemple de aici lucra cu Python 3.5.2, puteți rescrie după cum urmează :
Motivul pentru această schimbare ar putea fi faptul că conținutul unui fișier este în date (bytes), care nu face textul până când a fost decodat într-un fel.
genfrombytes
poate fi un nume mai bun decâtgenfromtxt
.încercați acest lucru
din StringIO import StringIO
x="1 3\n 4.5 8"
numpy.genfromtxt(StringIO(x))