В Python, что такое функциональный и эффективный для памяти способ читать стандартно, построчно? - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть https://stackoverflow.com/a/1450396/1810962 ответ из другого поста, который почти достигает этого:

import sys
data = sys.stdin.readlines()
preProcessed = map(lambda line: line.rstrip(), data)

Теперь я могу функционально работать со строками в data, применяя фильтр, картуи т. д. Однако он загружает весь стандарт в память.Есть ли ленивый способ построить поток строк?

1 Ответ

0 голосов
/ 01 декабря 2018

Просто итерируйте по sys.stdin, он будет повторяться по строкам.

Затем вы можете сложить выражения генератора или использовать map и filter, если хотите.Каждая входящая строка будет проходить через конвейер, никакой список не будет встроен в процесс.

Вот примеры каждого из них:

import sys

stripped_lines = (line.strip() for line in sys.stdin)
lines_with_prompt = ('--> ' + line for line in stripped_lines)
uppercase_lines = map(lambda line: line.upper(), lines_with_prompt)
lines_without_dots = filter(lambda line: '.' not in line, uppercase_lines)

for line in lines_without_dots:
    print(line)

И в действии, в терминале:

thierry@amd:~$ ./test.py 
My first line
--> MY FIRST LINE 
goes through the pipeline
--> GOES THROUGH THE PIPELINE
but not this one, filtered because of the dot. 
This last one will go through
--> THIS LAST ONE WILL GO THROUGH

Более короткий пример только с map, где map будет повторяться по строкам stdin:

import sys

uppercase_lines = map(lambda line: line.upper(), sys.stdin)

for line in uppercase_lines:
    print(line)

В действии:

thierry@amd:~$ ./test2.py 
this line will turn
THIS LINE WILL TURN

to uppercase
TO UPPERCASE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...