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

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

最佳答案

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

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

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

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

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

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

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

关于python - 转换为 TextIOWrapper 的 BytesIO 对象没有 fileno 属性。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42790693/

相关文章:

python - 重复函数应用

python - 如何在Python中查找同一个单词中的重复字母?

python - - vs -= 运算符与 numpy

scala - 推荐的 Scala io 库

python - pandas 多索引选择与列条件

java - 在单个 ZipOutputStream 中使用 ObjectOutputStream 写入多个 ZipEntry

ruby - 观看/阅读不断增长的日志文件

c - 奇数 'skip' 函数 : error when running is double loops

javascript - IndexedDB I/O 速度

python - 常规 Python 中的 %%writefile 魔术命令