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

时间:2017-11-10 23:16:06

标签: python python-3.x

我想从标准输入块读取块直到EOF。例如,我可能有一个非常大的文件,我想从STDIN一次读入并处理1024个字节,直到遇到EOF。我已经看过sys.stdin.read(),它会立即将所有内容保存在内存中。这是不可行的,因为可能没有足够的空间来存储整个文件。在sys.stdin"中还有#34;行,但是只用换行符分隔输入,这不是我想要的。有没有办法在Python中实现这一点?

3 个答案:

答案 0 :(得分:1)

文件对象的read()方法接受可选的size参数。

如果指定size,则最多读取并返回大小字节。如果已到达文件末尾,f.read()将返回一个空字符串('')。

请参阅io docsopen() docs

伪代码:

with open('file') as f:
    while True:
        buffer = f.read(1024) # Returns *at most* 1024 bytes, maybe less
        if buffer = '':
            break
        process_data(buffer)

答案 1 :(得分:0)

您可以使用f.read(n)以块的形式读取stdin(或任何文件),其中n是您要作为参数读取的整数字节数。如果文件中没有任何内容,它将返回空字符串。

答案 2 :(得分:0)

受@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