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

时间:2017-03-14 15:53:53

标签: 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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

您的计划的标准输入,输出和错误流(您使用input阅读并使用print撰写的那些)编号为01和{ {1}}。后续打开的文件通常由系统给出序列号。

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

如果你的字符串内容None绝对必要,你可以这样做:

  • 打开fileno()
  • 的文件
  • 写你的字符串
  • 将文件倒回到开头

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