【问题标题】:BytesIO object casted into TextIOWrapper does not have fileno attribute.转换为 TextIOWrapper 的 BytesIO 对象没有 fileno 属性。
【发布时间】:2017-03-14 15:53:53
【问题描述】:

我有以下代码:

>>> import io
>>> b = io.BytesIO(b"Hello World")
>>> f = io.TextIOWrapper(b)
>>> f.fileno()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
io.UnsupportedOperation: fileno

但是,当我加载一个文件时,有一个fileno 属性:

>>> f = open("test.py")
>>> f.fileno()
3

有没有办法为第一种情况创建fileno 属性,我将BytesIO 对象转换为TextIOWrapper 对象?

【问题讨论】:

    标签: python io


    【解决方案1】:

    嗯,fileno 不可用,因为没有文件

    fileno() 方法返回一个整数,表示打开的文件在操作系统的进程相关文件表中的位置。如果您没有实际打开文件,操作系统不会为您提供文件编号。

    程序的标准输入、输出和错误流(用input 读取和用print 写入)编号为012。系统通常会为后续打开的文件分配序列号。

    这不能可靠地伪造:当没有实际文件支持该对象时,您从fileno() 返回的任何内容都是谎言。这就是实现选择提高UnsupportedOperation 的原因。没有回报是有意义的,除了None

    如果你的字符串内容必须有一个fileno(),你可以这样做:

    • read+write打开一个文件
    • 写下你的字符串
    • 将文件倒回到开头

    但是,必须有更好的设计,不会强迫您使用此解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2018-03-17
      • 2010-10-21
      • 1970-01-01
      • 2011-08-19
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多