我想读取字节。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获取下一个字节,而不进行任何反编码,也不推进流的光标?