在http://docs.python.org/library/json.html中:
simplejson.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, use_decimal[, **kw]]]]]]]]])
将fp(一个.read() - 支持包含JSON文档的类文件对象)反序列化为Python对象。
我知道read()
和write()
做了什么。
但是在阅读了这个描述“read() - 支持类似文件的对象”之后,我发现我不知道哪种对象类型支持read()
和write()
。
我在其他文档中找不到。 任何人都可以详细说明声明?
为什么我问这个问题是为了让“simplejson.load(urllib.open(...))”完成。
“urllib.open(...)”的返回值不是有效对象,因此我必须为simplejson定制它。但是,似乎该字符串不是read() - 支持。
答案 0 :(得分:7)
类似文件的对象主要是StringIO
个对象,连接的套接字以及实际的文件对象。
如果一切顺利,urllib.urlopen()
也会返回一个类似文件的objekt,支持必要的方法。
答案 1 :(得分:1)
simplejson有调用加载和转储,它们使用和生成字符串而不是像对象这样的文件。
对于类文件和字符串对象,此链接在StringIO和simplejson的上下文中有一个示例。
http://svn.red-bean.com/bob/simplejson/tags/simplejson-1.3/docs/index.html
答案 2 :(得分:1)
在Python中,文件对象是一个暴露API的对象,该API具有执行通常在文件上执行的操作的方法,例如read()
或write()
。
在问题的示例中:simplejson.load(fp, ...)
,只需要通过fp
方法调用作为read()
传递的对象,该方法就可以在一个read()
上被调用。文件(即接受可选参数size
并返回str
或bytes
对象)。
不过,只要它具有read()
方法,就不必是真实文件。
类似于文件的对象只是 file-object 的同义词。参见Python Glossary。
答案 3 :(得分:0)
来自glossary:
文件对象的同义词
一个文件对象是
暴露面向文件的API的对象(带有诸如 作为底层资源的read()或write())。根据方式 它创建后,文件对象可以调解对实际磁盘的访问 文件或其他类型的存储或通信设备(用于 示例标准输入/输出,内存缓冲区,套接字,管道, 等等。)。文件对象也称为类似文件的对象或流。
文件对象实际上分为三类:原始二进制文件, 缓冲的二进制文件和文本文件。它们的接口在 io模块。创建文件对象的规范方法是使用 open()函数。
答案 4 :(得分:0)
The IO Class Hierarchy section in the IO documentation 包含一个表格,其中列出了不同类型的类文件对象的内置方法和存根方法。
基本上,有一个抽象基类的层次结构:
IOBase
,几乎没有承诺
RawIOBase
,提供无缓冲的二进制 IOBufferedIOBase
,提供缓冲的二进制 IOTextIOBase
,提供缓冲字符串IO要实现类文件对象,您需要对 IOBase
的三个后代之一进行子类化,而不是对 IOBase
本身进行子类化。请参阅 this answer 以尝试确定给定的类文件对象是其中的哪一个。
这些类中的每一个都提供了各种存根方法和混合:
班级 | 存根方法 | 混合 |
---|---|---|
IOBase |
fileno 、seek 、truncate |
close 、closed 、__enter__ 、__exit__ 、flush 、isatty 、__iter__ 、__next__ 、readable 、readline 、readlines 、seekable 、tell 、writable 、writelines |
RawIOBase |
readinto , write |
read , readall |
BufferedIOBase |
detach 、read 、read1 、write |
readinto , readinto1 |
TextIOBase |
detach 、read 、readline 、write |
encoding 、errors 、newlines |
这些方法的文档可以在上面链接的类的文档中找到。