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

9

Я не могу понять, почему код # 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   ответов
3

Лучшее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 строк или в другой функции / методе или даже в другом модуле. Компенсация новой строки при вводе с использованием запятой в конце оператора печати не является надежным решением.

14

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

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

@Jaro Вы правы, раздел в документации указывает на существенную разницу для печати между Python 2.x и 3.x.
, end='' с питоном 3
Спасибо, я не знал об этом. Я только что посмотрел. Кажется, что Python 3.0 содержит некоторые дополнительные функции, которые выходят на печать. Если я правильно понимаю, вы можете определить, как закончить свою строку в Python 3.0+found it here, И спасибо за указание на ошибку, да, я имел в виду код № 2. Исправлена. finspin
1

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

Допустим, у меня есть аргументы ради файла .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())

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

2

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

Пример:

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
Вpython3 это было быfor i in range(10): print(i,end=" ")
1

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

Хороший способ проверить семантику файла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')) вместо.

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

Похожие вопросы