python - StringIO() 参数 1 必须是字符串或缓冲区,而不是 cStringIO.StringIO
问题描述
我有一个将内容对象读入熊猫数据框的函数。
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 对象没有 seek 函数的错误。知道这里有什么问题吗?
解决方案
您只测试了InputType
,这是一个cStringIO.StringIO()
支持阅读的实例。您似乎拥有另一种类型,OutputType
即为支持写入的实例创建的实例:
>>> 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)
或者您可以只测试字符串和 [buffers]( 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()
也将被接受和工作。
推荐阅读
- python - Python Json.load 上的错误:额外数据行 10 第 2 列(字符 194)
- php - PHP:Check is null 作为参数传递或分配为默认值
- google-apis-explorer - 如何使用 youtube api 获取具有多个 videocategoryid 的视频
- mysql - MySQL SELECT 其他表中不存在的行的子字符串
- java - 无法从 Java 服务器向 android 设备发送 firebase fcm 推送通知
- unicode - 为什么我们需要各种 Unicode 编码
- javascript - Javascript :( 500 Internal server error) in the postman
- python - 我正在尝试移动我的角色,但玩家不会移动
- api - Microsoft Cognitive API 不断告诉我:“消息”:“输入数据不是有效的图像或密码保护。”
- python - 迭代器类未能在使用 h5py 打开的 HDF5 数据上引发 StopIteration