转换为 TextIOWrapper 的 BytesIO 对象没有 fileno 属性。

Ale*_*lex 6 python io

我有以下代码:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

>>> f = open("test.py")
>>> f.fileno()
3
Run Code Online (Sandbox Code Playgroud)

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

sle*_*ica 3

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

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

程序的标准输入、输出和错误流(使用 读取input和写入的流print)编号为012。随后打开的文件通常由系统给出序号。

这无法可靠地伪造:fileno()当没有实际文件支持该对象时,您返回的任何内容都是谎言。这就是为什么实施选择筹集UnsupportedOperation。没有回报是有意义的,除了也许None

fileno()如果绝对有必要为字符串内容提供 a ,则可以这样做:

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

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