Запретить Python печатать новую строку - PullRequest
3 голосов
/ 20 марта 2010

У меня есть этот код в Python

inputted = input("Enter in something: ")
print("Input is {0}, including the return".format(inputted))

, который выводит

Enter in something: something
Input is something
, including the return

Я не уверен, что происходит; если я использую переменные, которые не зависят от ввода пользователя, я не получаю символ новой строки после форматирования с помощью переменной. Я подозреваю, что Python может принимать символ новой строки в качестве ввода, когда я нажимаю return.

Как я могу сделать так, чтобы на входе не было никаких новых строк, чтобы я мог сравнить его с другими строками / символами? (например, something == 'a')

Ответы [ 4 ]

7 голосов
/ 20 марта 2010

Вы правы - новая строка включена в inputted. Чтобы удалить его, вы можете просто позвонить strip("\r\n"), чтобы удалить перевод строки с конца:

print("Input is {0}, including the return".format(inputted.strip("\r\n")))

Это не вызовет никаких проблем, если inputted не имеет новой строки в конце, но удалит все, что есть, поэтому вы можете использовать это, независимо от того, inputted - ввод пользователя или нет.

Если вам вообще не нужны какие-либо новые строки в тексте, вы можете использовать inputted.replace("\r\n", "") для удаления всех новых строк.

4 голосов
/ 20 марта 2010

Ваша проблема на самом деле Eclipse. Предполагая, что вы используете PyDev, я смог воспроизвести проблему. При вводе чего-либо в консоль Eclipse проблема возникает, как описано в вашем вопросе. Но при непосредственном выполнении того же самого скрипта с интерпретатором Python 3.1.1, inputted не включает символ новой строки.

Я исследовал исходный код Python и обнаружил, что input() использует GNU readline , если stdin является интерактивным (т. Е. TTY или приглашение, как бы вы его не называли), но возвращается к .readline() метод объекта stdin, если необходимо. Затем, если результат readline заканчивается на \n, этот символ удаляется. Примечание: здесь нет обработки CR-LF или LF-CR (в случае отказа)!

Итак, я написал этот маленький скрипт, чтобы увидеть, что на самом деле происходит:

import sys
from io import StringIO

for stdin in [sys.stdin, StringIO("test\r\ntest\r\n")]:
    sys.stdin = stdin 

    print("readline returns this: " + repr(sys.stdin.readline()))

    inputted = input("Enter in something: ")
    print("inputted: " + repr(inputted))

    print("inputted is printed like this: --> {0} <--".format(inputted))

Сначала выполняется код с обычным stdin (консоль или консоль Eclipse), а затем с подготовленным stdin, содержащим текст test\r\ntest\r\n.

Попробуйте запустить скрипт в Eclipse - вы должны дважды ввести строку. Вывод: Нажатие Enter в консоли Eclipse выдаст CR-LF ("\ r \ n"). Печать "\ r" в консоли Eclipse приведет к переходу на следующую строку.

С другой стороны, запуск его в консоли Windows даст ожидаемый результат: input() возвращает строку без перевода строки в конце, потому что (я думаю) используется GNU readline. С подготовленным stdin StringIO("test\r\n") результат input() будет "test \ r", как в Eclipse (хотя и не печатается как новая строка).

Надеюсь, все это имеет смысл ... но я до сих пор не знаю, является ли это ожидаемым поведением Затмения.

3 голосов
/ 20 марта 2010

Если вы хотите удалить только последние строки, вы можете использовать rstrip.
inputted.rstrip ("\r\n")

2 голосов
/ 20 марта 2010
inputted = inputted.strip()

Редактировать: Как уже отмечалось, это убьет все пробелов в начале и конце. Способ избавиться только от завершающего символа новой строки:

import re
inputted = re.sub("[\n\r]+$", "", inputted)
...