提问人:MaciejPL 提问时间:5/14/2015 最后编辑:Peter MortensenMaciejPL 更新时间:7/21/2022 访问量:329446
如何从用户那里获取多行输入 [duplicate]
How to get multiline input from the user [duplicate]
问:
我想编写一个获取多行输入并逐行处理的程序。为什么没有像 Python 3 那样的函数?raw_input
input
不允许用户放置用换行符 () 分隔的行。它只打印回第一行。Enter
它可以存储在变量中,甚至可以将其读取到列表中吗?
答:
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/......
评论
input()
raw_input