Python命令行 - 多行输入

7
我正在尝试使用Python解决https://www.spoj.pl上的Krypto问题,其中涉及控制台输入。
我的问题是,输入的字符串有多行,但在程序中需要作为一个单独的字符串。如果我只使用raw_input()并在控制台中粘贴(用于测试)文本,则Python会将其视为按每行回车键。因此我需要在循环中多次调用raw_input()。
问题在于,我无法以任何方式修改输入字符串,它没有任何标记符号表示结束,并且我不知道有多少行。
那么我该怎么办?
4个回答

7
在输入流结束时,raw_input将返回一个空字符串。因此,如果您真的需要累积整个输入(考虑到SPOJ的限制,您应该避免这样做),那么请执行以下操作:
buffer = ''
while True:
    line = raw_input()
    if not line: break

    buffer += line

# process input

1
我尝试了这个,但不幸的是它似乎不起作用。如果我在粘贴文本后按Enter键,程序仍然会等待更多输入-> 我需要在新的空行中按Enter键。SPOJ似乎有类似的行为。 - Dreiven
@Dreiven:去除空格 (raw_input().strip())。 - Cat Plus Plus
@Dreiven:你可以尝试使用sys.stdin.read(),但很可能上述代码和这个代码都会耗尽可用内存。 - Cat Plus Plus

1

由于raw_input()被设计为读取单行数据,如果使用这种方式可能会遇到困难。 一个简单的解决方案是将输入字符串放入文本文件中,然后从那里进行解析。

假设您有一个名为 input.txt 的文件,您可以按以下方式获取值

f = open(r'input.txt','rU')
for line in f:
  print line,

1
使用这里的最佳答案,您仍然会遇到应该处理的EOF错误。因此,我在这里添加了异常处理。
buffer = ''
while True:
    try:
         line = raw_input()
    except EOFError:
         break
    if not line: 
         break

    buffer += line

1
由于Windows的行尾标记为'\r\n',而Unix系统上为'\n',因此可以直接使用以下语句替换这些字符串:

your_input.replace('\r\n', '')


我不能这样替换它,因为raw_input()会为每一行单独调用。 - Dreiven
然后,您需要将数据收集到缓冲区或列表中...这很简单。 - user2665694
我必须多次调用raw_input(),每行输入一次->我不知道有多少行->我尝试PiotrLegnicas的解决方案->循环不会终止。在收集所有输入后删除breaks真的没有问题。 - Dreiven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接