StringIO() 参数 1 必须是字符串或缓冲区,而不是 cStringIO.StringIO
StringIO() argument 1 must be string or buffer, not cStringIO.StringIO
我有一个将内容对象读入 pandas 数据帧的函数。
import pandas as pd
from cStringIO import StringIO, InputType
def create_df(content):
assert content, "No content was provided, can't create dataframe"
if not isinstance(content, InputType):
content = StringIO(content)
content.seek(0)
return pd.read_csv(content)
但是我一直收到错误 TypeError: StringIO() argument 1 must be string or buffer, not cStringIO.StringIO
我在函数内部检查了StringIO()转换之前的内容的传入类型,它的类型是str
。如果没有转换,我会收到一个错误消息,指出 str 对象没有查找功能。知道这里出了什么问题吗?
您只测试了 InputType
,这是一个支持读取的 cStringIO.StringIO()
实例。您似乎拥有 other 类型,OutputType
,为支持 writing to:
的实例创建的实例
>>> import cStringIO
>>> finput = cStringIO.StringIO('Hello world!') # the input type, it has data ready to read
>>> finput
<cStringIO.StringI object at 0x1034397a0>
>>> isinstance(finput, cStringIO.InputType)
True
>>> foutput = cStringIO.StringIO() # the output type, it is ready to receive data
>>> foutput
<cStringIO.StringO object at 0x102fb99d0>
>>> isinstance(foutput, cStringIO.OutputType)
True
您需要测试 两种 类型,只需使用两种类型的元组作为 isinstance()
:
的第二个参数
from cStringIO import StringIO, InputType, OutputType
if not isinstance(content, (InputType, OutputType)):
content = StringIO(content)
或者,这是 更好的 选项,测试 read
和 seek
属性,因此您也可以支持常规文件:
if not (hasattr(content, 'read') and hasattr(content, 'seek')):
# if not a file object, assume it is a string and wrap it in an in-memory file.
content = StringIO(content)
或者您可以只测试字符串和 [缓冲区](https://docs.python.org/2/library/functions.html#buffer(,因为这是 StringIO()
可以支持的仅有的两种类型:
if isinstance(content, (str, buffer)):
# wrap strings into an in-memory file
content = StringIO(content)
这有一个额外的好处,即 Python 库中的任何其他文件对象,包括压缩文件和 tempfile.SpooledTemporaryFile()
和 io.BytesIO()
也将被接受并工作。
我有一个将内容对象读入 pandas 数据帧的函数。
import pandas as pd
from cStringIO import StringIO, InputType
def create_df(content):
assert content, "No content was provided, can't create dataframe"
if not isinstance(content, InputType):
content = StringIO(content)
content.seek(0)
return pd.read_csv(content)
但是我一直收到错误 TypeError: StringIO() argument 1 must be string or buffer, not cStringIO.StringIO
我在函数内部检查了StringIO()转换之前的内容的传入类型,它的类型是str
。如果没有转换,我会收到一个错误消息,指出 str 对象没有查找功能。知道这里出了什么问题吗?
您只测试了 InputType
,这是一个支持读取的 cStringIO.StringIO()
实例。您似乎拥有 other 类型,OutputType
,为支持 writing to:
>>> import cStringIO
>>> finput = cStringIO.StringIO('Hello world!') # the input type, it has data ready to read
>>> finput
<cStringIO.StringI object at 0x1034397a0>
>>> isinstance(finput, cStringIO.InputType)
True
>>> foutput = cStringIO.StringIO() # the output type, it is ready to receive data
>>> foutput
<cStringIO.StringO object at 0x102fb99d0>
>>> isinstance(foutput, cStringIO.OutputType)
True
您需要测试 两种 类型,只需使用两种类型的元组作为 isinstance()
:
from cStringIO import StringIO, InputType, OutputType
if not isinstance(content, (InputType, OutputType)):
content = StringIO(content)
或者,这是 更好的 选项,测试 read
和 seek
属性,因此您也可以支持常规文件:
if not (hasattr(content, 'read') and hasattr(content, 'seek')):
# if not a file object, assume it is a string and wrap it in an in-memory file.
content = StringIO(content)
或者您可以只测试字符串和 [缓冲区](https://docs.python.org/2/library/functions.html#buffer(,因为这是 StringIO()
可以支持的仅有的两种类型:
if isinstance(content, (str, buffer)):
# wrap strings into an in-memory file
content = StringIO(content)
这有一个额外的好处,即 Python 库中的任何其他文件对象,包括压缩文件和 tempfile.SpooledTemporaryFile()
和 io.BytesIO()
也将被接受并工作。