如何从用户那里获取多行输入[重复]
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 中的重复项
无法使用准备好的对象语句从 mysql 获取多行数据 [重复]