Как вводить без новой строки в Python?

Я пытаюсь создать простой редактор файлов на Python через консоль (называемую PyCons). Вот моя текущая программа:

def PyCons(f):
  file = open(f, "r")
  appe = open(f, "a")
  print("\n=====\nPyCons Editor, v1.2\nPython 3.6.1\n")
  global i
  i = 0
  for line in file:
    i += 1
    print(" {}|  ".format(i) + line, end='')
  for k in range(10000000000000):
    print("\n {}| ".format(i+1), end='')
    inp = input("")
    if inp == "@PyCons.save()":
      print("\n==== = ")
      break
    else:
      i += 1
      appe.write("\n" + inp)

Я использовал метод end, чтобы убедиться, что существующий код в файле был правильно напечатан в его строчном формате, но функция input не имеет атрибута end. Итак, когда я иду вводить код в редакторе:

PyCons("magic.html")    
...

=====
PyCons Editor, v1.2
Python 3.6.1

 1|  <p>Hello!</p>
 2|  <h1>Big text!</h1>
 3|  <h2>Smaller text!</h2>
#Should be no spaces here
 4|  <p>More stuff!</p>
#No spaces here either
 5|  @PyCons.save()

=====

... Я получаю большие неприятные промежутки между моими входами. Кто-нибудь знает способ подавить вывод этого пространства, аналогичный методу end='', используемому для print function?

Обновлено: расположение проекта для справки: https://repl.it/@xMikee/File-Editing

inp = input("").strip('\n') должен помочь
lenik 30.06.2018 20:12

Это не ясно, но я думаю, что его проблема может заключаться в том, что в терминале печатаются новые строки, а не только выходной OP записывает на диск. Если это так - не передавайте строку, назовите ее input() вместо input(""), это может решить вашу проблему.

Dillon Davis 30.06.2018 20:14

@lenik Это, к сожалению, не помогло.

connectyourcharger 30.06.2018 20:15

@DillonDavis Это тоже не сработало.

connectyourcharger 30.06.2018 20:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
3 088
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Новые строки из входов - это просто локальные эхо из консоли. Вы видите их на своем экране, но на самом деле они не возвращаются функцией input.

Настоящая проблема заключается в переводе строки, который вы явно печатаете перед каждым номером строки. Удалите \n, чтобы строка с номерами строк стала:

print(" {}| ".format(i+1), end='')

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

def PyCons(f):
    file = open(f, "r")
    appe = open(f, "a")
    print("\n=====\nPyCons Editor, v1.2\nPython 3.6.1\n")
    global i
    i = 0
    for line in file:
        i += 1
        print(" {}| ".format(i) + line, end='')
    if not line.endswith('\n'):
        print()
    for k in range(10000000000000):
        print(" {}| ".format(i+1), end='')
        inp = input("")
        if inp == "@PyCons.save()":
            print("\n==== = ")
            break
        else:
            i += 1
            appe.write("\n" + inp)

Это не работает из-за того, что я использую end='' (он делает так, что новый ввод находится в той же строке, что и предыдущий).

connectyourcharger 30.06.2018 20:19

Это действительно работает. Я сам пробовал ваш код с этим изменением. Вы пробовали?

blhsing 30.06.2018 20:20

Может быть, вставить print("") между циклами for, а затем удалить новую строку?

Dillon Davis 30.06.2018 20:20

@connectyourcharger Ну, а зачем вы вообще печатали \n перед каждым номером строки?

blhsing 30.06.2018 20:24

@blhsing Потому что, если я этого не сделаю, произойдет следующее: 4| <p>More stuff!</p> 5|, потому что я поместил end отпечатка в ''

connectyourcharger 30.06.2018 20:26

@connectyourcharger Но ваш ввод с клавиатуры дает вам новые строки локально, когда вы вводите и нажимаете Enter, поэтому вам не нужно печатать новые строки из кода.

blhsing 30.06.2018 20:30

@blhsing Использование end='' в операторе печати технически помещает начало «новой строки» в конец старой.

connectyourcharger 30.06.2018 20:32

@connectyourcharger Дело в том, что вы позволяете пользователю вводить новую строку в качестве ввода после отображения номера строки в качестве приглашения, поэтому, когда пользователь видит `3 | `в качестве приглашения и набирает <h2>Smaller text!</h2>, а затем нажимает Входить, нажатие клавиши Enter переводит курсор на новую строку из-за локального эха.

blhsing 30.06.2018 20:35

@blhsing Не могли бы вы дать ссылку на вашу отредактированную программу, которая работает?

connectyourcharger 30.06.2018 20:38

@connectyourcharger Моя отредактированная программа - не что иное, как удаление \n из вашей линии print("\n {}| ".format(i+1), end=''). Но теперь я понимаю, в чем может быть ваша проблема. В загружаемом файле может не быть завершающей строки новой строки в конце, поэтому вам нужно напечатать новую строку самостоятельно, если это так.

blhsing 30.06.2018 20:41

Позвольте нам продолжить обсуждение в чате.

connectyourcharger 30.06.2018 20:44

@connectyourcharger Я только что отредактировал свой ответ предложением, которое только что сделал, чтобы учесть отсутствие завершающей новой строки в загружаемом файле. Тогда попробуйте.

blhsing 30.06.2018 20:44

Другие вопросы по теме