Hoe lees ik meerdere regels onbewerkte invoer?

Ik wil een Python-programma maken dat meerdere regels gebruikersinvoer nodig heeft. Bijvoorbeeld:

This is a multilined input.
It has multiple sentences.
Each sentence is on a newline.

Hoe kan ik meerdere regels onbewerkte invoer opnemen?


Antwoord 1, autoriteit 100%

sentinel = '' # ends when this string is seen
for line in iter(input, sentinel):
    pass # do things here

Om elke regel als een tekenreeks te krijgen, kunt u het volgende doen:

'\n'.join(iter(input, sentinel))

Python 2:

'\n'.join(iter(raw_input, sentinel))

Antwoord 2, autoriteit 16%

Als alternatief kunt u sys.stdin.read()proberen dat de hele invoer retourneert tot EOF:

import sys
s = sys.stdin.read()
print(s)

Antwoord 3, autoriteit 6%

Blijf regels lezen totdat de gebruiker een lege regel invoert (of verander stopwordin iets anders)

text = ""
stopword = ""
while True:
    line = raw_input()
    if line.strip() == stopword:
        break
    text += "%s\n" % line
print text

Antwoord 4, autoriteit 3%

Alleen dit antwoord uitbreiden https://stackoverflow.com/a/11664652/4476612
in plaats van een stopwoord kun je gewoon controleren of er een regel is of niet

content = []
while True:
    line = raw_input()
    if line:
        content.append(line)
    else:
        break

u krijgt de regels in een lijst en voegt u vervolgens samen met \n om in uw formaat te komen.

print '\n'.join(content)

Antwoord 5, autoriteit 2%

Probeer dit

import sys
lines = sys.stdin.read().splitlines()
print(lines)

INPUT:

1

2

3

4

OUTPUT:
[‘1’, ‘2’, ‘3’, ‘4’]


Antwoord 6, autoriteit 2%

*Ik heb zelf zo lang met deze vraag geworsteld, omdat ik een manier wilde vinden om meerdere regels gebruikersinvoer te lezen zonder dat de gebruiker deze met Control D (of een stopwoord) hoeft te beëindigen.
Uiteindelijk heb ik een manier gevonden in Python3, met behulp van de pyperclip-module (die je moet installeren met pip install)
Hieronder volgt een voorbeeld waarvoor een lijst met IP’s nodig is
*

import pyperclip
lines = 0
while True:
    lines = lines + 1 #counts iterations of the while loop.
    text = pyperclip.paste()
    linecount = text.count('\n')+1 #counts lines in clipboard content.
    if lines <= linecount: # aslong as the while loop hasn't iterated as many times as there are lines in the clipboard.
        ipaddress = input()
        print(ipaddress)
    else:
        break

Voor mij doet dit precies wat ik zocht; neem meerdere regels invoer, voer de acties uit die nodig zijn (hier een eenvoudige afdruk) en verbreek de lus wanneer de laatste regel werd afgehandeld. Ik hoop dat het ook voor jou net zo nuttig kan zijn.


Antwoord 7

De gemakkelijkste manier om meerdere regels van een prompt/console te lezen als u exact aantal regelsweet dat u wilt dat uw python leest, is begrip van de lijst.

lists = [ input() for i in range(2)]

De bovenstaande code leest 2 regels. En sla invoer op in een lijst.


Antwoord 8

sys.stdin.read() kan worden gebruikt om invoer van meerdere regels van de gebruiker te ontvangen. Bijvoorbeeld

>>> import sys
>>> data = sys.stdin.read()
  line one
  line two
  line three
  <<Ctrl+d>>
>>> for line in data.split(sep='\n'):
  print(line)
o/p:line one
    line two
    line three

Antwoord 9

Dit is de beste manier om de code in python >3.5-versie te schrijven

a= int(input())
if a:
    list1.append(a)
else:
    break

zelfs als je een limiet wilt stellen aan het aantal waarden dat je kunt gebruiken, zoals

while s>0:
a= int(input())
if a:
    list1.append(a)
else:
    break
s=s-1

Antwoord 10

Een schonere manier (zonder stopwoordhack of CTRL+D) is om te gebruiken Python Prompt Toolkit

We kunnen dan het volgende doen:

from prompt_toolkit import prompt
if __name__ == '__main__':
    answer = prompt('Paste your huge long input: ')
    print('You said: %s' % answer)

De invoerverwerking is behoorlijk efficiënt, zelfs bij lange invoer met meerdere regels.


Antwoord 11

De Python Prompt Toolkit is eigenlijk een geweldig antwoord, maar het bovenstaande voorbeeld laat het niet echt zien. Een beter voorbeeld is get-multiline-input.pyuit de map met voorbeelden:

#!/usr/bin/env python
from prompt_toolkit import prompt
from prompt_toolkit.formatted_text import HTML
def prompt_continuation(width, line_number, wrap_count):
    """
    The continuation: display line numbers and '->' before soft wraps.
Notice that we can return any kind of formatted text from here.
The prompt continuation doesn't have to be the same width as the prompt
which is displayed before the first line, but in this example we choose to
align them. The `width` input that we receive here represents the width of
the prompt.
    """
    if wrap_count > 0:
        return " " * (width - 3) + "-> "
    else:
        text = ("- %i - " % (line_number + 1)).rjust(width)
        return HTML("<strong>%s</strong>") % text
if __name__ == "__main__":
    print("Press [Meta+Enter] or [Esc] followed by [Enter] to accept input.")
    answer = prompt(
    "Multiline input: ", multiline=True, prompt_continuation=prompt_continuation
)
    print("You said: %s" % answer)

Met deze code krijgt u invoer met meerdere regels waarin elke regel kan worden bewerkt, zelfs nadat volgende regels zijn ingevoerd. Er zijn ook enkele leuke extra functies, zoals regelnummers. De invoer wordt beëindigd door op de escape-toets en vervolgens op de enter-toets te drukken:

~/Desktop py prompt.py
Druk op [Meta+Enter] of [Esc] gevolgd door [Enter] om invoer te accepteren.
Invoer van meerdere regels: eerste regel tekst, voer vervolgens in
– 2 – tweede regel tekst, voer dan in
– 3 – derde regel tekst, pijltjestoetsen werken om te bewegen, enter
– 4 – en regels kunnen naar wens worden bewerkt, totdat u
– 5 – druk op de escape-toets en vervolgens op de enter-toets
Je zei: eerste regel tekst, voer dan in
tweede regel tekst en voer vervolgens
. in
derde regel tekst, pijltjestoetsen werken om te bewegen, enter
en lijnen kunnen naar wens worden bewerkt, totdat u
druk op de escape-toets en vervolgens op de enter-toets
~/Desktop ❯


Antwoord 12

Hoe vind je dit? Ik deed telnet na.
Het fragment is zeer duidelijk 🙂

#!/usr/bin/env python3
my_msg = input('Message? (End Message with <return>.<return>) \n>> ')
each_line = ''
while not each_line == '.':
    each_line = input('>> ')
    my_msg += f'\n{each_line}'
my_msg = my_msg[:-1]  # Remove unwanted period.
print(f'Your Message:\n{my_msg}')

Antwoord 13

Met Python 3 kun je elke regel toewijzen aan data:

while data := input():
    print("line", data)

Other episodes