我正在使用Python 3.2.1,无法导入StringIO
模块。我使用io.StringIO
,它可以工作,但我不能像这样将它与numpy
的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'
9条答案
按热度按时间1cosmwyk1#
当我写import StringIO时,它说没有这样的模块。
What’s New In Python 3.0:
StringIO
和cStringIO
模块已经消失。相反,导入io
模块并分别对文本和数据使用io.StringIO
或io.BytesIO
。.
一个可能有用的方法来修复一些Python 2代码,使其在Python 3中也能工作(caveat emptor):
StringIO
模块时需要考虑的问题。* 有关更直接的解决方案,请参阅TypeError: Can't convert 'bytes' object to str implicitly
。evrscar22#
在我的例子中,我使用了:
2nbm6dog3#
在Python 3中,
numpy.genfromtxt
需要字节流。使用以下方法:c3frrgcw4#
Roman Shapovalov的代码应该可以在Python 3.x和Python 2.6/2.7中运行。下面是完整的例子:
输出量:
Python 3.x的解释:
numpy.genfromtxt
接受一个字节流(一个类似文件的对象,被解释为字节而不是Unicode)。io.BytesIO
接受一个字节字符串并返回一个字节流。另一方面,io.StringIO
将接受Unicode字符串并返回Unicode流。x
被分配了一个字符串字面量,在Python 3.x中是一个Unicode字符串。encode()
接受Unicode字符串x
并从中生成一个字节字符串,从而为io.BytesIO
提供一个有效参数。Python 2.6/2.7的唯一区别是
x
是一个字节字符串(假设没有使用from __future__ import unicode_literals
),然后encode()
接受字节字符串x
,并仍然从中产生相同的字节字符串。所以结果是一样的。由于这是SO关于
StringIO
最常见的问题之一,这里有一些关于import语句和不同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字符串,则返回Unicode流。cStringIO.StringIO
(Python 2.x)-StringIO.StringIO
的更快版本,但不能接受包含非ASCII字符的Unicode字符串。请注意,
StringIO.StringIO
作为from StringIO import StringIO
导入,然后作为StringIO(...)
使用。或者你先执行import StringIO
,然后再使用StringIO.StringIO(...)
。模块名和类名恰好相同。这与datetime
类似。使用什么,取决于您支持的Python版本:
io.BytesIO
或io.StringIO
。io.BytesIO
或io.StringIO
。尽管StringIO.StringIO
是灵活的,因此似乎更适合2.6/2.7,但这种灵活性可能会掩盖3.x中出现的bug。例如,我有一些代码使用StringIO.StringIO
或io.StringIO
,具体取决于Python版本,但我实际上传递的是一个字节字符串,所以当我在Python 3.x中测试它时,它失败了,必须修复。使用
io.StringIO
的另一个优点是支持通用换行符。如果将关键字参数newline=''
传递给io.StringIO
,它将能够拆分\n
、\r\n
或\r
中的任何一个上的行。我发现StringIO.StringIO
特别会在\r
上出错。请注意,如果从
six
导入BytesIO
或StringIO
,则在Python 2.x中将获得StringIO.StringIO
,而在Python 3.x中将获得来自io
的相应类。如果你同意我前面的段落的评估,这实际上是一种情况,你应该避免six
,而只是从io
导入。StringIO.StringIO
来支持2.5或更低版本,所以你也可以使用six
。但是要意识到同时支持2.5和3.x通常是非常困难的,所以如果可能的话,你应该考虑将最低支持的版本提升到2.6。1hdlvixo5#
谢谢你的问题,罗曼的回答。我找了半天才找到这个我希望以下内容能帮助到其他人。
Python 2.7
参见:https://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html
Python 3.5:
旁白:
dtype=”|Sx”,其中x ={ 1,2,3,...}中的任一个:
dtypes. Difference between S1 and S2 in Python
“那|S1和|S2字符串是数据类型描述符;第一个表示数组保存长度为1的字符串,第二个表示长度为2。...”
eulz3vhy6#
您可以使用six模块中的StringIO:
but5z9lq7#
为了让here的例子在Python 3.5.2中工作,你可以重写如下:
更改的原因可能是文件的内容是以数据(字节)形式存在的,这些数据在以某种方式解码之前不会生成文本。
genfrombytes
可能是一个比genfromtxt
更好的名字。qq24tv8q8#
下面是Python 3的另一个例子。它将使用两个函数将两个数字相加,然后使用CProfile来保存
.prof
文件。然后,它将使用pstats.Stats
和`StringIO``加载保存文件,将数据转换为字符串以供进一步使用。main.py
使用方法:
输出量:
评论:我们可以观察到,在上面的代码中,time.sleep函数大约需要2.507秒。
mmvthczy9#
希望能满足您的要求