python stdin read_python 3:使用readahead从stdin管道读取字节

在Python 3中,通过sys.stdin读取字节时,会遇到不可寻求的文件流问题。本文探讨了使用sys.stdin.buffer、peek方法以及io库的各种尝试,寻找在不反编码和不推进流光标的情况下读取下一个字节的方法。讨论了Python的IO类层次结构,以帮助理解不同类型的IO操作。
摘要由CSDN通过智能技术生成

我想读取字节。sys.stdin以文本模式打开,但它有一个可用于读取字节的缓冲区:sys.stdin.buffer。

我的问题是,当我将数据导入python时,如果我想提前阅读,似乎只有两个选项,否则我将得到一个io.UnsupportedOperation: File or stream is not seekable.从sys.stdin读取缓冲文本,将该文本解码为字节,然后返回

(sys.stdin.read(1).decode(); sys.stdin.seek(-1, io.SEEK_CUR)。

由于输入流中的字节不可编码,因此不可接受。

使用peek从stdin的缓冲区中获取一些字节,将其切片到适当的数字,然后祈祷,因为peek不能保证任何东西:它可能给出的比您请求的少或多

(sys.stdin.buffer.peek(1)[:1])

peek实际上是文档不足的,它给了您一堆字节,您必须对这些字节进行密集的性能切片。

顺便说一下,这个错误实际上只适用于以下情况:对于./myscript.py

#!/usr/bin/env python3

from sys import stdin

print(stdin)

print(stdin.buffer)

print(stdin.buffer.raw)"

$ ./testio.py

$ ./testio.py

[the same as above]

$ echo hi | ./testio.py

[the same as above]

一些最初的想法,比如将字节流包装成随机访问缓冲区,但失败了,错误与上面提到的相同:BufferedRandom(sys.stdin.buffer).seek(0)•io.UnsupportedOperation…

最后,为了您的方便,我提出:

Python的io类层次结构IOBase

├RawIOBase

│└FileIO

├BufferedIOBase (buffers a RawIOBase)

│├BufferedWriter┐

│├BufferedReader│

││ └─────┴BufferedRWPair

│├BufferedRandom (implements seeking)

│└BytesIO (wraps a bytes)

└TextIOBase

├TextIOWrapper (wraps a BufferedIOBase)

└TextIO (wraps a str)

如果你忘了这个问题:我如何从stdin获取下一个字节,而不进行任何反编码,也不推进流的光标?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值