如何从用户那里获取多行输入 [duplicate]

How to get multiline input from the user [duplicate]

提问人:MaciejPL 提问时间:5/14/2015 最后编辑:Peter MortensenMaciejPL 更新时间:7/21/2022 访问量:329446

问:

我想编写一个获取多行输入并逐行处理的程序。为什么没有像 Python 3 那样的函数?raw_input

input不允许用户放置用换行符 () 分隔的行。它只打印回第一行。Enter

它可以存储在变量中,甚至可以将其读取到列表中吗?

python 输入 多行

评论

1赞 ZdaR 5/14/2015
因为 Python3.x 中有用于从用户那里获取输入的功能。input()
1赞 MaciejPL 5/14/2015
但它不允许放置多行
1赞 jonrsharpe 5/14/2015
您是如何获得“多行输入”的?为什么不一次获取一行,循环直到用户输入空行?raw_input
0赞 MaciejPL 5/14/2015
但我想一次输入所有行
2赞 jonrsharpe 5/14/2015
这并不能回答我的第一个问题,只能部分回答第二个问题。

答:

78赞 ZdaR 5/14/2015 #1

在 Python 3.x 中,Python 2.x 已被 function 取代。但是,在这两种情况下,您都不能输入多行字符串,为此,您需要逐行从用户那里获取输入,然后使用 ,或者您也可以采用各种行并使用运算符将它们连接起来,运算符之间用raw_input()input().join()\n+\n

要从用户那里获得多行输入,您可以像这样:

no_of_lines = 5
lines = ""
for i in xrange(no_of_lines):
    lines+=input()+"\n"

print(lines)

lines = []
while True:
    line = input()
    if line:
        lines.append(line)
    else:
        break
text = '\n'.join(lines)

评论

1赞 MaciejPL 5/14/2015
好的,这很清楚。因此,没有选项可以粘贴用换行符分隔的几行文本并存储它。如何将其写入文件,文本文件。
1赞 ZdaR 5/14/2015
是的,实际上在 Python 中,您可以通过使用""" multi line string """
0赞 Matt McCarthy 8/29/2020
@ZdaR也有效。''' multi line string '''
-1赞 maggick 5/14/2015 #2

使用内置函数从用户那里获取输入行。input()

您可以在此处阅读帮助

您可以使用以下代码一次获取多行(以空行结束):

while input() != '':
    do_thing

评论

3赞 Barmar 12/27/2020
这不会将输入放入变量中。
26赞 chepner 5/14/2015 #3

input(prompt)基本上等同于

def input(prompt):
    print(prompt, end='', file=sys.stderr, flush=True)
    return sys.stdin.readline()

如果您愿意,您可以直接阅读。sys.stdin

lines = sys.stdin.readlines()

lines = [line for line in sys.stdin]

five_lines = list(itertools.islice(sys.stdin, 5))
    

前两个要求输入以某种方式结束,要么到达文件的末尾,要么通过用户键入 Control-D(或 Windows 中的 Control-Z)来发出结束信号。最后一个将在读取五行后返回,无论是从文件还是从终端/键盘。

评论

3赞 Nuno André 10/3/2016
[line.splitlines() for line in sys.stdin]删除回车。
1赞 Czechnology 11/5/2020
如果想要将数据通过管道传输到 Python,则此解决方案最有效,即 或者两者都会打印.printf "line1\nline2\n" | python -c 'import sys; print(list(sys.stdin))'python -c 'import sys; print(list(sys.stdin))' <<< "line1\nline2\n"['line1\n', 'line2\n']
1赞 DonkeyKong 11/20/2020
这是OP问题的答案。这真是太棒了。可能有一种方法可以实现自定义的 Quit 命令,而不是强迫用户不直观地按 ctrl-d。我可能不会弄清楚这一点,但如果其他人愿意........
0赞 chepner 11/20/2020
@DonkeyKong Ctrl-d 并不是那么不直观,如果你真正理解从文件中读取意味着什么。如果您的用例是针对由特定命令终止的输入,则您的程序不应简单地从 读取。sys.stdin
1赞 chepner 11/20/2020
如果你的代码真的读到文件的末尾,那就意味着:读到没有更多的东西可读,直到它读到一个特殊值才读到。Control-D 是指示键盘输入所表示的“文件”结尾的(特定于终端的)方式。
-3赞 mohankumar.A 7/5/2016 #4
no_of_lines = 5
lines = ""
for i in xrange(5):
    lines+=input()+"\n"
    a=raw_input("if u want to continue (Y/n)")
    ""
    if(a=='y'):
        continue
    else:
        break
    print lines

评论

3赞 abarisone 7/5/2016
欢迎来到 SO :)最好在你发布的代码中添加一个解释作为答案,这样它就能帮助访问者理解为什么这是一个好的答案。
0赞 E.F. Lucas 2/8/2023
这是我的解决方案: def MultylineInput(): print(“输入/粘贴您的内容。Ctrl-Z' 保存它。lines = [] while True: try: line = input() + '\n' if line: lines.append(line) except EOFError: break text = '\n'.join(lines) return text
101赞 xiaket 7/6/2016 #5

raw_input可以正确处理 EOF,因此我们可以编写一个循环,读取直到我们从用户那里收到 EOF (Ctrl-D):

Python 3 (英语)

print("Enter/Paste your content. Ctrl-D or Ctrl-Z ( windows ) to save it.")
contents = []
while True:
    try:
        line = input()
    except EOFError:
        break
    contents.append(line)

Python 2 中文文档

print "Enter/Paste your content. Ctrl-D or Ctrl-Z ( windows ) to save it."
contents = []
while True:
    try:
        line = raw_input("")
    except EOFError:
        break
    contents.append(line)

评论

4赞 Alastair McCormack 9/16/2016
好答案。要回答 OP 关于 Python 3 的问题,请替换并更改语句以使用括号raw_input("")input()print
0赞 2rs2ts 5/10/2017
当用户在行上写了一些东西,但不是按换行符的回车键,而是按ctrl-d触发EOFError时会发生什么?根据我的测试,它导致最后一个元素被修剪了最后一个字符。contents
0赞 xiaket 6/20/2017
我想你已经使用了双Ctrl-D(这不是我们在这里讨论的情况),因为单个Ctrl-D不能在非空行中触发EOFErlor。
0赞 Stevoisiak 11/2/2017
在 PyDev 中,按 Ctrl-D 结束输入无法正常工作。
0赞 MattCochrane 3/12/2023
在许多语言中,不建议对控制流使用异常,许多程序员采用“仅在特殊情况下使用异常”的习惯用语(即不用于“正常”行为)。这似乎在 python 中更常见。对于更多讨论,这里有一个讨论权衡的堆栈交换问题:softwareengineering.stackexchange.com/questions/351110/......