我想逐块读取标准输入,直到EOF。例如,我可能有一个非常大的文件,我想一次从 STDIN 读取和处理 1024 个字节,直到遇到 EOF。我见过sys.stdin.read((,它可以一次将所有内容保存在内存中。这是不可行的,因为可能没有足够的可用空间来存储整个文件。还有"sys.stdin中的行",但这仅用换行符分隔输入,这不是我要找的。有没有办法在Python中做到这一点?
文件对象的read()
方法接受可选的size
参数。
如果指定 size
,则读取和返回最多大小的字节。如果已到达文件末尾,f.read(( 将返回一个空字符串 (''(。
请参阅 io 文档和 open(( 文档。
伪代码:
with open('file') as f:
while True:
buffer = f.read(1024) # Returns *at most* 1024 bytes, maybe less
if buffer = '':
break
process_data(buffer)
f.read(n)
以块形式读取 stdin(或任何文件(,其中 n
是要作为参数读取的整数字节数。如果文件中没有剩余内容,它将返回空字符串。
受到@Andre答案的启发,但使用 python3 代码并且还处理 SIGINT(只是因为......
#!/usr/bin/env python3
########
# g.py #
########
import signal
import sys
def process_data(buffer):
sys.stdout.buffer.write(buffer)
sys.stdout.buffer.flush()
def read_stdin_stream(handler, chunk_size=1024):
with sys.stdin as f:
while True:
buffer = f.buffer.read(chunk_size)
if buffer == b'':
break
handler(buffer)
def signal_handler(sig, frame):
sys.stdout.buffer.flush()
sys.exit(0)
def main():
signal.signal(signal.SIGINT, signal_handler)
# notice the `chunk_size` of 1 for this particular example
read_stdin_stream(process_data, chunk_size=1)
if __name__ == "__main__":
main()
例:
$ for i in $(seq 1 5); do echo -n "$i" && sleep 1; done | python3 g.py
12345