我使用的是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  

当我输入StringIO时,它会说

ImportError: No module named 'StringIO'

当前回答

你可以从六个模块中使用StringIO:

import six
import numpy

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

其他回答

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

输出:

array([[ 1. ,  3. ],
       [ 4.5,  8. ]])

Python 3.x的解释:

numpy。genfromtxt接受一个字节流(解释为字节而不是Unicode的类文件对象)。 io。BytesIO接受一个字节字符串并返回一个字节流。io。另一方面,StringIO将接受一个Unicode字符串并返回一个Unicode流。 x被赋值为一个字符串字面值,在Python 3中。x是一个Unicode字符串。 encode()获取Unicode字符串x并从中生成字节字符串,从而给出io. xml。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, and 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从StringIO导入StringIO,然后用作StringIO(…)。或者你导入StringIO,然后使用StringIO.StringIO(…)。模块名和类名恰好是相同的。它类似于datetime。

使用什么,取决于你支持的Python版本:

If you only support Python 3.x: Just use io.BytesIO or io.StringIO depending on what kind of data you're working with. If you support both Python 2.6/2.7 and 3.x, or are trying to transition your code from 2.6/2.7 to 3.x: The easiest option is still to use io.BytesIO or io.StringIO. Although StringIO.StringIO is flexible and thus seems preferred for 2.6/2.7, that flexibility could mask bugs that will manifest in 3.x. For example, I had some code which used StringIO.StringIO or io.StringIO depending on Python version, but I was actually passing a byte string, so when I got around to testing it in Python 3.x it failed and had to be fixed. Another advantage of using io.StringIO is the support for universal newlines. If you pass the keyword argument newline='' into io.StringIO, it will be able to split lines on any of \n, \r\n, or \r. I found that StringIO.StringIO would trip up on \r in particular. Note that if you import BytesIO or StringIO from six, you get StringIO.StringIO in Python 2.x and the appropriate class from io in Python 3.x. If you agree with my previous paragraphs' assessment, this is actually one case where you should avoid six and just import from io instead. If you support Python 2.5 or lower and 3.x: You'll need StringIO.StringIO for 2.5 or lower, so you might as well use six. But realize that it's generally very difficult to support both 2.5 and 3.x, so you should consider bumping your lowest supported version to 2.6 if at all possible.

为了从这里举例子 使用Python 3.5.2,你可以重写如下:

import io
data =io.BytesIO(b"1, 2, 3\n4, 5, 6") 
import numpy
numpy.genfromtxt(data, delimiter=",")

更改的原因可能是文件的内容是数据(字节),直到以某种方式解码才成为文本。Genfrombytes可能是一个比genfromttxt更好的名字。

当我写导入StringIO时,它说没有这样的模块。

Python 3.0新增功能:

StringIO和cStringIO模块消失了。相反,导入io . xml文件 模块并使用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

注意:这个例子可能与问题的主要问题无关,只是作为在处理缺少的StringIO模块时需要考虑的问题。对于更直接的解决方案,消息TypeError:不能隐式地将'bytes'对象转换为str,请参阅这个答案。

我希望这能满足你的要求

import PyPDF4
import io

pdfFile = open(r'test.pdf', 'rb')
pdfReader = PyPDF4.PdfFileReader(pdfFile)
pageObj = pdfReader.getPage(1)
pagetext = pageObj.extractText()

for line in io.StringIO(pagetext):
    print(line)

谢谢OP的问题,谢谢Roman的回答。我费了好大劲才找到这个;我希望下面的内容能对其他人有所帮助。

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.]]
"""

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.]]
"""

旁白:

dtype="|Sx",其中x ={1,2,3,…}中的任意一个:

dtypes。Python中S1和S2的区别

“|S1和|S2字符串是数据类型描述符;第一个表示数组包含长度为1的字符串,第二个长度为2的字符串. ...”