Ik gebruik Python 3.2.1 en ik kan de module StringIO
niet importeren. ik gebruik
io.StringIO
en het werkt, maar ik kan het niet gebruiken met numpy
‘s genfromtxt
zoals 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 StringIO
schrijf, 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
StringIO
encStringIO
zijn verdwenen. Importeer in plaats daarvan deio
module en gebruikio.StringIO
ofio.BytesIO
voor 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
StringIO
module. voor een meer Directe oplossing Het berichtTypeError: 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.genfromtxt
verwacht 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. genfrombytes
Kan 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 .prof
bestand op te slaan. Dan laadt het het save-bestand met pstats.Stats
en “ `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))