StringIO in Python3

Ik gebruik Python 3.2.1 en ik kan de module StringIOniet importeren. ik gebruik
io.StringIOen het werkt, maar ik kan het niet gebruiken met numpy‘s genfromtxtzoals dit:

x="1 3\n 4.5 8"        
numpy.genfromtxt(io.StringIO(x))

Ik krijg de volgende foutmelding:

TypeError: Can't convert 'bytes' object to str implicitly  

en wanneer ik import StringIOschrijf, staat er

ImportError: No module named 'StringIO'

Antwoord 1, autoriteit 100%

wanneer ik import StringIO schrijf, staat er dat zo’n module niet bestaat.

Van Wat is er nieuw in Python 3.0:

De modules StringIOen cStringIOzijn verdwenen. Importeer in plaats daarvan de io
module en gebruik io.StringIOof io.BytesIOvoor tekst en gegevens
respectievelijk.

.


Een mogelijk bruikbare methode om Python 2-code te repareren zodat deze ook in Python 3 werkt (caveat emptor):

try:
    from StringIO import StringIO ## for Python 2
except ImportError:
    from io import StringIO ## for Python 3

OPMERKING: Dit voorbeeld kan zich tangentieel zijn voor de belangrijkste kwestie van de vraag en is alleen opgenomen als iets om te overwegen bij het genereren van de ontbrekende StringIOmodule. voor een meer Directe oplossing Het bericht TypeError: Can't convert 'bytes' object to str implicitly, zie dit antwoord .


2, Autoriteit 17%

In mijn geval heb ik het gebruikt:

from io import StringIO

3, Autoriteit 8%

op python 3 numpy.genfromtxtverwacht een bytes-stream. Gebruik het volgende:

numpy.genfromtxt(io.BytesIO(x.encode()))

4, Autoriteit 3%

Bedankt voor uw vraag, en Romein voor uw antwoord. Ik moest een beetje zoeken om dit te vinden; Ik hoop dat het volgende anderen helpt.

python 2.7

Zie: https://docs.scipy.org/ DOC / numpy / 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.]]
"""

Terzijde:

dtype=”|Sx”, waarbij x = een van { 1, 2, 3, …}:

dtypes. Verschil tussen S1 en S2 in Python

“De |S1 en |S2 strings zijn descriptors van het gegevenstype; de eerste betekent dat de array strings met lengte 1 bevat, de tweede met lengte 2. …”


Antwoord 5, autoriteit 3%

Je kunt de StringIOvan de zesmodule:

import six
import numpy
x = "1 3\n 4.5 8"
numpy.genfromtxt(six.StringIO(x))

6

Om voorbeelden te maken van hier
Werk met Python 3.5.2, u kunt als volgt herschrijven:

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

De reden voor de wijziging kan zijn dat de inhoud van een bestand in gegevens (bytes) is die geen tekst maken totdat ze op de een of andere manier worden gedecodeerd. genfrombytesKan een betere naam zijn dan genfromtxt.


7

Hier is een ander voorbeeld voor python 3 . Het zal twee functies gebruiken om twee cijfers toe te voegen en vervolgens CProfile te gebruiken om de .profbestand op te slaan. Dan laadt het het save-bestand met pstats.Statsen “ `stringio” om de gegevens om te zetten naar een tekenreeks voor verder gebruik.

Main.py

import cProfile
import time
import pstats
from io import StringIO
def add_slow(a, b):
    time.sleep(0.5)
    return a+b
def add_fast(a, b):
    return a+b
prof = cProfile.Profile()
def main_func():
    arr = []
    prof.enable()
    for i in range(10):
        if i%2==0:
            arr.append(add_slow(i,i))
        else:
            arr.append(add_fast(i,i))
    prof.disable()
    #prof.print_stats(sort='time')
    prof.dump_stats("main_funcs.prof")
    return arr
main_func()
stream = StringIO();
stats = pstats.Stats("main_funcs.prof", stream=stream); 
stats.print_stats()
stream.seek(0)
print(16*'=',"RESULTS",16*'=')
print (stream.read())

Gebruik:

python3 main.py

Uitvoer:

================ RESULTS ================
Tue Jul  6 17:36:21 2021    main_funcs.prof
         26 function calls in 2.507 seconds
   Random listing order was used
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       10    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}
        5    2.507    0.501    2.507    0.501 {built-in method time.sleep}
        5    0.000    0.000    2.507    0.501 profiler.py:39(add_slow)
        5    0.000    0.000    0.000    0.000 profiler.py:43(add_fast)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Opmerkingen: we kunnen zien dat in de bovenstaande code de time.sleep-functie ongeveer 2,507 seconden duurt.


Antwoord 8

Ik hoop dat dit aan uw eisen voldoet

import PyPDF4
import io
pdfFile = open(r'test.pdf', 'rb')
pdfReader = PyPDF4.PdfFileReader(pdfFile)
pageObj = pdfReader.getPage(1)
pagetext = pageObj.extractText()
for line in io.StringIO(pagetext):
    print(line)

Antwoord 9

importeer cStringIO -> importeer io

cStringIO.StringIO() -> io.BytesIO()


Antwoord 10

probeer dit

van StringIO importeer StringIO

x=”1 3\n 4.5 8″

numpy.genfromtxt(StringIO(x))

Other episodes