Я использую Python 3.2.1 и не могу импортировать StringIO
модуль. Я использую
, io.StringIO
и она работает, но я не могу использовать его с numpy
«S , genfromtxt
как это:
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'
источник
TypeError
s (ожидаемый строковый аргумент, получивший «байтов»), если вы сделаете это изменение изолированно. Вам нужно тщательно различать btyes и str (unicode) в python 3.from io import StringIO
StringIO
и егоfrom io import BytesIO
следует применять вместо этого. Протестировал себя на python 3.5 @ eclipse pyDev + win7 x64. Пожалуйста, дайте мне знать, если я был неправ, спасибо.В моем случае я использовал:
источник
На Python 3
numpy.genfromtxt
ожидается поток байтов. Используйте следующее:источник
Спасибо ОП за ваш вопрос, а Роман за ваш ответ. Мне пришлось немного поискать, чтобы найти это; Я надеюсь, что следующее помогает другим.
Python 2.7
См .: https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html.
Python 3.5:
В стороне:
dtype = "| Sx", где x = любой из {1, 2, 3, ...}:
dtypes. Разница между S1 и S2 в Python
«Строки | S1 и | S2 являются дескрипторами типа данных; первая означает, что массив содержит строки длины 1, вторая - длины 2. ...»
источник
Вы можете использовать StringIO из шести модулей:
источник
Код Романа Шаповалова должен работать как в Python 3.x, так и в Python 2.6 / 2.7. Вот снова с полным примером:
Вывод:
Объяснение для Python 3.x:
numpy.genfromtxt
принимает поток байтов (подобный файлу объект, интерпретируемый как байты вместо Unicode).io.BytesIO
принимает строку байтов и возвращает поток байтов.io.StringIO
с другой стороны, будет принимать строку Unicode и возвращать поток Unicode.x
получает строковый литерал, который в Python 3.x является строкой Юникода.encode()
берет строку Unicodex
и делает из нее байтовую строку, тем самым даваяio.BytesIO
действительный аргумент.Единственное отличие для Python 2.6 / 2.7 состоит в том, что
x
это строка байтов (при условии, чтоfrom __future__ import unicode_literals
она не используется), а затем онаencode()
берет строку байтовx
и все еще делает из нее ту же строку байтов. Так что результат тот же.Поскольку это один из самых популярных вопросов SO
StringIO
, вот еще несколько пояснений к операторам импорта и различным версиям Python.Вот классы, которые принимают строку и возвращают поток:
io.BytesIO
(Python 2.6, 2.7 и 3.x) - принимает строку байта. Возвращает поток байтов.io.StringIO
(Python 2.6, 2.7 и 3.x) - принимает строку Unicode. Возвращает поток Unicode.StringIO.StringIO
(Python 2.x) - принимает строку байта или строку Юникода. Если строка байтов, возвращает поток байтов. Если строка Unicode, возвращает поток Unicode.cStringIO.StringIO
(Python 2.x) - более быстрая версияStringIO.StringIO
, но не может принимать строки Unicode, содержащие символы не ASCII.Обратите внимание, что
StringIO.StringIO
импортируется какfrom StringIO import StringIO
, а затем используется какStringIO(...)
. Либо так, либо вы делаете,import StringIO
а затем используетеStringIO.StringIO(...)
. Имя модуля и имя класса просто совпадают. Это похоже наdatetime
это.Что использовать, в зависимости от поддерживаемых версий Python:
Если вы поддерживаете только Python 3.x: просто используйте
io.BytesIO
или вio.StringIO
зависимости от того, с какими данными вы работаете.Если вы поддерживаете Python 2.6 / 2.7 и 3.x или пытаетесь перевести ваш код с 2.6 / 2.7 на 3.x: самый простой вариант - использовать
io.BytesIO
илиio.StringIO
. Несмотря на то,StringIO.StringIO
что гибкость и, следовательно, предпочтительнее для 2.6 / 2.7, эта гибкость может маскировать ошибки, которые проявятся в 3.x. Например, у меня был код, который использовалStringIO.StringIO
илиio.StringIO
зависел от версии Python, но на самом деле я передавал байтовую строку, поэтому, когда я приступил к тестированию его в Python 3.x, он потерпел неудачу и должен был быть исправлен.Еще одним преимуществом использования
io.StringIO
является поддержка универсальных новых строк. Если передать аргумент ключевого словаnewline=''
вio.StringIO
, он будет иметь возможность разделить строки на любом из\n
,\r\n
или\r
. Я обнаружил, чтоStringIO.StringIO
будет сбить с толку\r
в частности, подвело бы.Обратите внимание, что если вы импортируете
BytesIO
илиStringIO
изsix
, вы получаетеStringIO.StringIO
в Python 2.x и соответствующий класс изio
в Python 3.x. Если вы согласны с оценкой моих предыдущих абзацев, то на самом деле это один из случаев, когда вам следует избегатьsix
и просто импортировать изio
него.Если вы поддерживаете Python 2.5 или ниже и 3.x: вам потребуется
StringIO.StringIO
2.5 или ниже, так что вы также можете использоватьsix
. Но имейте в виду, что в целом очень трудно поддерживать и 2.5, и 3.x, поэтому вам следует рассмотреть возможность повышения минимальной поддерживаемой версии до 2.6, если это вообще возможно.источник
Для того чтобы приведенные здесь примеры работали с Python 3.5.2, вы можете переписать следующее:
Причиной изменения может быть то, что содержимое файла находится в данных (байтах), которые не создают текст, пока не будут каким-либо образом декодированы.
genfrombytes
может быть лучше, чем имяgenfromtxt
.источник
попробуй это
из StringIO импортировать StringIO
x = "1 3 \ n 4,5 8"
numpy.genfromtxt (StringIO (х))
источник