585

Python 3.2.1 を使用していますが、StringIOモジュールをインポートできません。私は使用 して動作しますが、次のような'sio.StringIOでは使用できません。numpygenfromtxt

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

次のエラーが表示されます。

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

そして私が書くとき、import StringIOそれは言います

ImportError: No module named 'StringIO'
4

9 に答える 9

989

import StringIO と書くと、そのようなモジュールはないと表示されます。

What's New In Python 3.0から:

およびモジュールはなくなりましたStringIOcStringIO代わりに、io モジュールをインポートして、テキストとデータにそれぞれio.StringIOorを使用します。io.BytesIO

.


一部の Python 2 コードを修正して Python 3 でも機能するようにするためのおそらく有用な方法 (警告 emptor):

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

注:この例は、質問の主な問題に接している可能性があり、欠落しているStringIOモジュールに一般的に対処するときに考慮すべきものとしてのみ含まれています。 メッセージのより直接的な解決策については、この回答TypeError: Can't convert 'bytes' object to str implicitlyを参照してください。

于 2013-08-17T03:43:30.490 に答える
156

私の場合、私は使用しました:

from io import StringIO
于 2016-03-17T10:15:11.767 に答える
26

OP さん、ご質問ありがとうございます。Roman さん、ご回答いただきありがとうございます。これを見つけるには、少し検索する必要がありました。以下が他の人に役立つことを願っています。

パイソン 2.7

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

パイソン 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.]]
"""

余談:

dtype="|Sx"、ここで x = { 1、2、3、...} のいずれか:

dtype。Python の S1 と S2 の違い

「|S1 および |S2 文字列はデータ型記述子です。最初の配列は長さ 1 の文字列を保持することを意味し、2 番目は長さ 2 の文字列を保持します。...」

于 2016-05-22T23:34:17.750 に答える
24

sixモジュールのStringIOを使用できます。

import six
import numpy

x = "1 3\n 4.5 8"
numpy.genfromtxt(six.StringIO(x))
于 2016-05-31T16:04:35.653 に答える
1

Python 3の別の例を次に示します。2 つの関数を使用して 2 つの数値を加算し、CProfile を使用して.profファイルを保存します。pstats.Stats次に、 ```StringIO`` を使用して保存ファイルをロードし、さらに使用するためにデータを文字列に変換します。

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())

使用法:

python3 main.py

出力:

================ 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}

コメント: 上記のコードでは、time.sleep 関数に約 2.507 秒かかっていることがわかります。

于 2021-07-06T09:37:29.330 に答える