Python:如何按字节块从stdin读取,直到EOF



我想逐块读取标准输入,直到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

最新更新