我想从标准输入块读取块直到EOF。例如,我可能有一个非常大的文件,我想从STDIN一次读入并处理1024个字节,直到遇到EOF。我已经看过sys.stdin.read(),它会立即将所有内容保存在内存中。这是不可行的,因为可能没有足够的空间来存储整个文件。在sys.stdin"中还有#34;行,但是只用换行符分隔输入,这不是我想要的。有没有办法在Python中实现这一点?
答案 0 :(得分:1)
文件对象的read()
方法接受可选的size
参数。
如果指定size
,则最多读取并返回大小字节。如果已到达文件末尾,f.read()将返回一个空字符串('')。
请参阅io docs和open() 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