Дополнительная строка в выводе при печати внутри цикла

Я не могу понять, почему код # 1 возвращает лишнюю пустую строку, а код # 2 - нет. Может кто-нибудь объяснить это? Разница заключается в лишней запятой в конце кода # 2.

<code># Code #1
file = open('tasks.txt')

for i, text in enumerate(filer, start=1):
    if i >= 2 and i <= 4:
        print "(%d) %s" % (i, text)

# Code #2
file = open('tasks.txt')

for i, text in enumerate(filer, start=1):
    if i >= 2 and i <= 4:
        print "(%d) %s" % (i, text),
</code>

Вот содержимое моего файла tasks.txt:

<code>line 1
line 2
line 3
line 4
line 5
</code>

Результат из кода № 1:

<code>(2) line 2

(3) line 3

(4) line 4
</code>

Результат из кода № 2 (желаемый результат):

<code>(2) line 2
(3) line 3
(4) line 4
</code>

Ответы на вопрос(5)

Решение Вопроса

Трейлинг, в операторе печати будет подавлен перевод строки. В вашем первом заявлении на печать нет ни одного, а во втором.

Ввод, который вы прочитали, все еще содержит\n что вызывает дополнительный перевод строки. Один из способов компенсировать это состоит в том, чтобы запретить печати печатать собственный перевод строки, используя запятую. В качестве альтернативы и, возможно, лучшего подхода, вы можете удалить новую строку во вводе, когда вы читаете его (например, используяrstrip() )

 01 авг. 2018 г., 17:20
, end='' с питоном 3
 04 мая 2012 г., 23:41
@Jaro Вы правы, раздел в документации указывает на существенную разницу для печати между Python 2.x и 3.x.
 finspin04 мая 2012 г., 23:37
Спасибо, я не знал об этом. Я только что посмотрел. Кажется, что Python 3.0 содержит некоторые дополнительные функции, которые выходят на печать. Если я правильно понимаю, вы можете определить, как закончить свою строку в Python 3.0+found it here, И спасибо за указание на ошибку, да, я имел в виду код № 2. Исправлена.

Лучшееgeneral Ответ на эту проблему заключается в удалении завершающего символа новой строки (если есть!), как только вы его прочитаете:

f = open('tasks.txt')
for i, text in enumerate(f, start=1):
    text = text.rstrip('\n')
    if i >= 2 and i <= 4:
        print "(%d) %s" % (i, text)

Таким образом, вы отсоедините свой вывод от своего ввода ... ваш выходной код может находиться на расстоянии 20 строк или в другой функции / методе или даже в другом модуле. Компенсация новой строки при вводе с использованием запятой в конце оператора печати не является надежным решением.

Существует очень простое решение для этого.

Допустим, у меня есть аргументы ради файла .txt (называемого numbers.txt), из которого я читаю со значениями:

234234
777776
768768

Затем, используя следующий код:

filename = numbers.txt

with open(filename) as file_object:
    for line in file_object:
        print(line)

Даст вам лишнюю пустую строку, так как у вас есть проблемы с. Но с небольшими изменениями вы можете избавиться от лишних пустых строк, используя метод rstrip (). Таким образом, код становится:

filename = numbers.txt

with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

Теперь вы получите свои результаты без этих раздражающих пустых строк между ними!

Перебор файлов удерживает строки в файле. Итак, есть одна новая строка из вашей печати и одна из строки.

Хороший способ проверить семантику файлаStringIO, Взглянуть:

>>> from StringIO import StringIO
>>> x = StringIO("abc\ncde\n")
>>> for line in x: print repr(line)
... 
'abc\n'
'cde\n'

Запятая подавляет перевод строки из печати, как говорит Левон, так что в строке остается только перевод строки.

Я удаляю строки из строк, используяs.rstrip('\n'), Он избавляется от любых новых строк в любом современном формате (Unix, Windows или старая Mac OS). Так что вы можете сделатьprint "(%d) %s" % (i, text.rstrip('\n')) вместо.

 04 мая 2012 г., 23:42
-1 Если (как и должно быть) вы открываете файл в текстовом режиме, разделитель строк изменится на'\n'так что все, что вам нужно, это.rstrip('\n'), Если это оставляет'\r' в конце вашей строки, то это'\r' является частью вашегоDATAпредположительно, из-за того, что производитель файла несколько запутался.
 finspin04 мая 2012 г., 23:41
Спасибо за чаевые!
 05 мая 2012 г., 00:01
@DevinJeanpierre: если вы не используетеrU, вы ожидаете, что строки будут разделеныos.linesep и\r' should not be silently flushed away. If using RU, then stripping не нужен. Следовательно: вboth случаи,\r не должен появиться.
 04 мая 2012 г., 23:48
@ Джон Ты не прав. Разделитель строк изменяется с \ r \ n '; на \ n; в Windows, но не в Unix. То есть: одни и те же файлы будут вести себя по-разному в разных ОС, если мы будем делать то, что вы предлагаете. Может быть, это то, что мы хотим, но это не то, что вы сказали. Однако если мы читаем «rU», они читают то же самое, и тогда нет необходимости удалять «r».

Чтобы не было пустой строки, нужно, в конце выписки

Пример:

for i in range(10):
    print i,

>>>0 1 2 3 4 5 6 7 8 9

for i in range(10):
    print i

>>>
0
1
2
3
4
5
6
7
8
9
 06 сент. 2015 г., 13:50
Вpython3 это было быfor i in range(10): print(i,end=" ")

Ваш ответ на вопрос