【问题标题】:What is exactly a file-like object in Python?Python 中的类文件对象到底是什么?
【发布时间】:2011-05-20 13:23:52
【问题描述】:

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(包含 JSON 文档的支持 .read() 的类文件对象)反序列化为 Python 对象。

我知道read()write() 做什么。

但是看了这个描述“read()-supporting file-like object”后,我发现我不知道什么对象类型支持read()write()

我在其他文档中找不到。 任何人都可以详细说明该声明吗?

我问这个问题是为了完成“simplejson.load(urllib.open(...))”。
“urllib.open(...)”的返回值不是一个有效的对象,所以我必须为simplejson定制它。但是,该字符串似乎不支持 read()。

【问题讨论】:

  • 好吧,你自己回答了你的问题:真的 any 支持正确调用 read()、write() 或两者的对象被认为是一个文件-像对象。它真的可以是你喜欢的任何对象——鸭子打字的乐趣。
  • 我认为没有任何官方标准。大多数接口应该准确地指定它们需要的功能。如果你想知道其他东西是否支持所需的东西,你必须查看它的文档或阅读它的源代码。
  • “类文件对象”实际上是precisely defined

标签: python


【解决方案1】:

来自glossary

file-like object

文件对象的同义词

一个文件对象是

file object

一个暴露面向文件的 API 的对象(使用诸如 作为底层资源的 read() 或 write())。取决于方式 它被创建,文件对象可以调解对真实磁盘的访问 文件或其他类型的存储或通信设备(用于 例如标准输入/输出、内存缓冲区、套接字、管道、 等等。)。文件对象也称为类文件对象或流。

实际上有三类文件对象:原始二进制文件, 缓冲的二进制文件和文本文件。它们的接口定义在 io 模块。创建文件对象的规范方法是使用 open() 函数。

【讨论】:

  • "with methods such as" ...我想这真的让我们回到了最初的问题:这组方法究竟是什么?是例如“模式”是否是此类对象的必需属性?
  • @KlaasvanSchelven 不幸的是,这可能取决于底层操作系统或文件系统。
  • 我想这个问题在这一点上是修辞性的 ;-) 关键是我们对“精确定义”的含义有不同的看法
【解决方案2】:

在 Python 中,文件对象 是一个公开 API 的对象,该 API 具有用于执行通常对文件执行的操作的方法,例如 read()write()

在问题的示例中:simplejson.load(fp, ...),作为fp 传递的对象只需要有一个read() 方法,可调用方式与文件上的read() 相同(即接受可选参数@ 987654328@ 并返回 strbytes 对象)。

不过,这不必是真实文件,只要它有 read() 方法即可。

类文件对象只是文件对象的同义词。见Python Glossary

【讨论】:

    【解决方案3】:

    类似文件的对象主要是StringIO 对象、连接的套接字以及实际的文件对象。

    如果一切顺利,urllib.urlopen() 会返回一个支持必要方法的类文件对象。

    【讨论】:

    • the necessary methods...这是最重要的方面。有哪些方法?
    【解决方案4】:

    The IO Class Hierarchy section in the IO documentation 包含一个表格,列出了不同类型的类文件对象的内置方法和存根方法。

    基本上,抽象基类是有层次结构的:

    要实现类似文件的对象,您可以继承IOBase 的三个后代之一,但不能继承IOBase 本身。请参阅this answer 以尝试确定给定的类文件对象是其中的哪一个。

    这些类中的每一个都提供了各种存根方法和混合:

    Class Stub Methods Mixins
    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

    这些方法的文档可以在上面链接的类文档中找到。

    【讨论】:

      【解决方案5】:

      simplejson 有调用 loadsdumps 来消耗和生成字符串而不是像文件这样的对象。

      此链接在 StringIO 和 simplejson 上下文中有一个示例,适用于类文件和字符串对象。

      http://svn.red-bean.com/bob/simplejson/tags/simplejson-1.3/docs/index.html

      【讨论】:

      • @user313439,不客气。为了清楚起见,您应该使用带有字符串的转储和加载。在您的情况下添加 StringIO 是额外的开销。
      猜你喜欢
      • 2014-06-05
      • 2017-10-12
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多