我有以下代码:

>>> 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对象?

最佳答案

好吧,fileno不可用,因为没有文件。

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

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

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

如果绝对需要字符串内容使用fileno(),则可以执行以下操作:


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


但是,必须有一个更好的设计,这不会迫使您使用此替代方法。

08-19 21:54