2013-04-30 48 views
0

目前,我正在研究一个Python程序,该程序返回在多行输入中出现次数最多的单词,最后一行是字符串“### ”。如何测试在Python中没有输入3.3.0

poetry = [] 
max = 0 
maxitem = None 
while True: 
poetry.append(input().lower().split()) 
for x in poetry: 
    count = poetry.count(x) 
if count > max: 
    max = count 
    maxitem = x 
    print(maxitem) 

现在,我遇到的主要问题是我在while循环体中得到的EOF错误。据我所知,这背后的原因是它不断要求新的输入线,但它没有。我不知道如何纠正这一点。任何与该计划的其余部分的帮助,也将不胜感激。

+0

你可以'try'你的代码,赶上的SyntaxError,使你的代码的过程为空字符串或者只是继续迭代。 – Dolphiniac 2013-04-30 16:50:11

+2

@Dolphiniac:什么'SyntaxError'?你有没有尝试在2.x中运行这个python-3.x代码? – abarnert 2013-04-30 16:53:26

+0

@abarnert也许我做到了。谢谢。我想我需要更新。 – Dolphiniac 2013-04-30 17:07:35

回答

4

不要使用input()来读取数据,使用sys.stdin代替:

for line is sys.stdin: 
    poetry.append(line.lower().split()) 

这会读取来自stdin文件句柄行,直到关闭未抛出异常EOF。如果stdin开始关闭,则循环体不会执行。

+0

谢谢,尽管我更倾向于使用input(),因为这是我对这项任务的期望。 – Dan 2013-04-30 16:56:46

+1

值得指出两者之间的差异。 'input'会去掉每个尾随的换行符(这不重要,因为你明确地调用'strip')。对于某些IDE/GUI包装器,'input'可以更好地工作(除非你使用一个IDE)。 'input'将会总是立即运行,而不是等到你打到EOF时为止,或者至少填充一个缓冲区(这不重要,因为你没有运行像文件读取那样缓慢的代码,或者人类用户或时间敏感)。迭代文件要简单得多,且易于阅读(总是很重要)。 – abarnert 2013-04-30 17:03:04

3

使用sys.stdin正如Martijn Pieters所建议的那样,但为了完整起见,您可以继续使用input()。你只需要抓住EOFError异常并退出循环:

while True: 
    try: 
     poetry.append(input().lower().split()) 
    except EOFError: 
     break 
+0

你可以通过使用['iter'](http://docs.python.org/3/library/functions.html#iter)的双参数形式将它变成一个简单的'for'循环。 (这并不意味着你应该_特别是因为,为了真正做到这一点,你会希望通过一个包装函数来转换'EOFError'来返回一个标记,在这一点上,你可能会写一个代替包装发电机。) – abarnert 2013-04-30 17:05:07