Python:吸收键盘输入的换行符

时间:2014-07-18 17:43:40

标签: python input

我有一个特定于键盘多行输入的问题。我的程序似乎没有吸收换行符。结果是,在处理输入之后,程序似乎认为有许多回车等于输入中的换行符数。

我查看了sys模块(sys.stdin.flush()),msvsrc模块(msvcrt.kbhit()和msvcrt.getch()),raw_input,并尝试了我在搜索中可以想到的一切,但是我要干了。也许strip()会起作用,但我似乎无法弄清楚一般情况。

我得到的输出是:

Enter a string: def countLetters():
    s = input("Enter a string: ")
    d = histogram(s.upper())
    printSortedDict(d, True)
('T', 3)
('E', 3)
('F', 1)
('D', 1)
(' ', 1)
(':', 1)
('R', 1)
('(', 1)
('N', 1)
(')', 1)
('L', 1)
('U', 1)
('C', 1)
('O', 1)
('S', 1)

Continue (yes/no): 
Continue (yes/no): 
Continue (yes/no): 
Continue (yes/no): 

我希望输出只显示一个“继续(是/否):”。看来input()例程正在吃最后一个换行符(如预期的那样)但不是任何中间换行符。这些换行符似乎被解释为“继续(是/否):”语句的输入。

我正在使用Python 3.4.1。我正在开发Win8,但希望解决方案至少在Linux上运行(如果解决方案是特定于平台的)。这是程序。查看问题的最简单方法就是复制源代码并将其作为程序的输入。

#
# letterCountDict - count letters of input.  uses a dict()
#
"""letterCountDict - enter a string and the count of each character is returned """

# stolen from p. 122 of "Python for Software Design" by Allen B. Downey
def histogram(s):
    """builds a histogram from the characters of string s"""
    d = dict()
    for c in s:
        if c in d:
            d[c] += 1
        else:
            d[c] = 1
    return d

def printSortedDict(d, r=False):
    """sort and print a doctionary.  r == True indicates reserve sort."""
    sl = sorted(d.items(), key=lambda x: x[1], reverse=r)
    for i in range(len(sl)):
        print(sl[i])

def countLetters():
    s = input("Enter a string: ")
    d = histogram(s.upper())
    printSortedDict(d, True)

answerList = ["yes", "no"]
done = False
while not done:
    countLetters()
    ans = ""
    while ans not in answerList:
        ans = input("\nContinue (yes/no): ").replace(" ", "").lower()
    if ans == "no":
        done = True

2 个答案:

答案 0 :(得分:3)

input()不接受多行。每次调用input()都会检索到一行。

所以,你第一次打电话输入:

    s = input("Enter a string: ")

收到这一行:

def countLetters():

果然,你可以看到它有三个T,三个E等等。

input()的下一次调用是:

    ans = input("\nContinue (yes/no): ").replace(" ", "").lower()
您键入的

s = input("Enter a string: ")

由于您的回复既不是'yes'也不是'no',因此您的回复会再次询问。这次你输入:

d = histogram(s.upper())

既不是'yes'也不是'no'

这种模式一直持续到你厌倦了为问题输入废话。最后,输入" no"游戏结束。

如果您想一次阅读多行,请尝试sys.stdin.read()sys.stdin.readlines()。例如:

import sys
def countLetters():
    print("Enter several lines, followed by the EOF signal (^D or ^Z)")
    s = sys.stdin.read()
    d = histogram(s.upper())
    printSortedDict(d, True)

答案 1 :(得分:-1)

当您从此行获得输入时

s = input("Enter a string: ")将其替换为

s = input("Enter a string: ").replace('\n', '')