use*_*744 407 python io python-3.x
我使用的是Python 3.2.1,我无法导入StringIO模块.我使用
io.StringIO和它的作品,但我不能使用它numpy的genfromtxt是这样的:
x="1 3\n 4.5 8"
numpy.genfromtxt(io.StringIO(x))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
TypeError: Can't convert 'bytes' object to str implicitly
Run Code Online (Sandbox Code Playgroud)
当我写import StringIO它时说
ImportError: No module named 'StringIO'
Run Code Online (Sandbox Code Playgroud)
nob*_*bar 665
当我写入导入StringIO时,它说没有这样的模块.
在
StringIO和cStringIO模块都没有了.而是导入io模块并分别使用io.StringIO或io.BytesIO用于文本和数据.
.
修复一些Python 2代码的一种可能有用的方法也适用于Python 3(需要注意的话):
try:
from StringIO import StringIO ## for Python 2
except ImportError:
from io import StringIO ## for Python 3
Run Code Online (Sandbox Code Playgroud)
注意:此示例可能与问题的主要问题相关,并且仅作为一般性地解决缺失
StringIO模块时要考虑的事项. 有关更直接的解决方案TypeError: Can't convert 'bytes' object to str implicitly,请参阅此答案.
Rom*_*lov 68
在Python 3上numpy.genfromtxt需要一个字节流.使用以下内容:
numpy.genfromtxt(io.BytesIO(x.encode()))
Run Code Online (Sandbox Code Playgroud)
Vic*_*art 23
感谢OP的提问和罗曼的答案.我不得不搜索一下才发现这个; 我希望以下帮助其他人.
Python 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.]]
"""
Run Code Online (Sandbox Code Playgroud)
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.]]
"""
Run Code Online (Sandbox Code Playgroud)
在旁边:
dtype ="| Sx",其中x = {1,2,3,...}中的任何一个:
"| S1和| S2字符串是数据类型描述符;第一个意味着数组包含长度为1的字符串,第二个长度为2. ..."
Tia*_*nho 19
import six
import numpy
x = "1 3\n 4.5 8"
numpy.genfromtxt(six.StringIO(x))
Run Code Online (Sandbox Code Playgroud)
S. *_*rby 17
Roman Shapovalov的代码应该在Python 3.x以及Python 2.6/2.7中运行.这里再次提供完整的示例:
import io
import numpy
x = "1 3\n 4.5 8"
numpy.genfromtxt(io.BytesIO(x.encode()))
Run Code Online (Sandbox Code Playgroud)
输出:
array([[ 1. , 3. ],
[ 4.5, 8. ]])
Run Code Online (Sandbox Code Playgroud)
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版本:
如果您只支持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.StringIO2.5或更低版本,所以你不妨使用six.但是要意识到通常很难同时支持2.5和3.x,因此如果可能的话,你应该考虑将你支持的最低版本提高到2.6.
为了使这里的示例 与Python 3.5.2一起使用,您可以重写如下:
import io
data =io.BytesIO(b"1, 2, 3\n4, 5, 6")
import numpy
numpy.genfromtxt(data, delimiter=",")
Run Code Online (Sandbox Code Playgroud)
改变的原因可能是文件的内容是数据(字节),在以某种方式解码之前不会产生文本.genfrombytes可能是比一个更好的名字genfromtxt.