6

Как использовать StringIO в Python 3 с numpy.genfromtxt()?

6

Я использую Python 3.2.1, и у меня возникла проблема с импортом модуля StringIO. Я использую io.StringIO, и это работает, но я не могу использовать его с функцией genfromtxt() из библиотеки numpy следующим образом:

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'

Как я могу решить эту проблему?

3 ответ(ов)

1

В вашем случае вы можете использовать следующий импорт:

from io import StringIO

StringIO позволяет вам создать объект, который будет вести себя как файл, но будет работать с строками в памяти, что может быть полезно для обработки текстовых данных. Если у вас есть другие вопросы относительно использования StringIO, пожалуйста, уточните!

0

В Python 3 функция numpy.genfromtxt ожидает байтовый поток. Вы можете использовать следующий код:

import io
import numpy as np

data = "ваши данные здесь"  # замените на ваши данные
array = np.genfromtxt(io.BytesIO(data.encode()))

Таким образом, с помощью io.BytesIO вы сможете преобразовать строку в байтовый поток, который правильно воспринимается numpy.genfromtxt.

0

Вот еще один пример для Python 3. Он использует две функции для сложения двух чисел, а затем использует 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 секунды.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь