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

Posted

技术标签:

【中文标题】如何从用户那里获取多行输入[重复]【英文标题】:How to get multiline input from user [duplicate] 【发布时间】:2015-07-26 04:09:37 【问题描述】:

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

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

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

【问题讨论】:

因为在 Python3.x 中有 input() 用于获取用户的输入。 但它不允许放置多行 您是如何通过raw_input 获得“多行输入”的?为什么不一次取一行,循环直到用户输入一个空行? 但我想一次输入所有行 这没有回答我的第一个问题,只是部分回答了第二个问题。 【参考方案1】:

在 Python 3.x 中,Python 2.x 的 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)

【讨论】:

好的,这很清楚。所以没有选项可以粘贴几行用换行符分隔的文本并存储它。将其写入文件,文本文件怎么样。 是的,实际上在 Python 中,您可以使用 """ multi line string """ 获得多行字符串 @ZdaR ''' multi line string ''' 也可以。【参考方案2】:

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)

【讨论】:

好答案。要回答 OP 关于 Python 3 的问题,请将 raw_input("") 替换为 input() 并将 print 语句更改为使用括号 当用户在行上写了一些东西,而不是按回车换行,他们按 ctrl-d 触发 EOFError 时会发生什么?根据我的测试,它会导致 contents 中的最后一个元素的最后一个字符被修剪。 我想你已经使用了双 Ctrl-D(我们在这里讨论的情况并非如此),因为单个 Ctrl-D 无法在非空行中触发 EOFError。 在 PyDev 中,按 Ctrl-D 结束输入不能正常工作。【参考方案3】:

input(prompt) 基本等价于

def input(prompt):
    print(prompt, end='', file=sys.stderr)
    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)来表示结束。最后一个将在读取五行后返回,无论是从文件还是从终端/键盘。

【讨论】:

[line.splitlines() for line in sys.stdin] 删除回车。 如果要将数据通过管道传输到 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'] 这是 OPs 问题的答案。它太棒了。可能有一种方法可以实现自定义退出命令,而不是强迫用户不直观地按 ctrl-d。我可能不会弄明白,但如果其他人想........ @DonkeyKong Ctrl-d 如果您真正理解从 文件 中读取的含义,那么 Ctrl-d 并不是那么不直观。如果您的用例是由特定命令终止的输入,您的程序不应该简单地从sys.stdin读取。 如果你的代码真的读到了文件的末尾,那就意味着:读到没有更多要读的东西,直到读到一个特殊的值才读。 Control-D 是(特定于终端的)指示键盘输入表示的“文件”结束的方式。【参考方案4】:

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

您可以阅读the help here。

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

while input() != '':
    do_thing

【讨论】:

这不会将输入放入变量中。【参考方案5】:
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

【讨论】:

欢迎来到 SO :) 最好在您发布的代码中添加解释作为答案,这样可以帮助访问者理解为什么这是一个很好的答案。

以上是关于如何从用户那里获取多行输入[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项

在表单中获取多行的帖子值[重复]

为啥我的 php 代码没有从数据库中获取多行 [重复]

无法使用准备好的对象语句从 mysql 获取多行数据 [重复]

Oracle中的多行插入查询(从一张表中选择多行并插入到另一张表中[重复]

如何将多行文本粘贴到python输入中[重复]