Python добавляет дополнительную выходную строку для вывода

Входной файл: a.txt

aaaaaaaaaaaa
bbbbbbbbbbb
cccccccccccc

Код python:

with open("a.txt") as f:
    for line in f:
        print line

Проблема:

[[email protected] 0]# python read_lines.wsgi
aaaaaaaaaaaa

bbbbbbbbbbb

cccccccccccc

поскольку вы можете видеть, что на выходе есть дополнительная линия между каждым элементом.

Как предотвратить это?

Ответ 1

print добавляет новую строку, и строки ввода уже заканчиваются новой строкой.

Стандартное решение состоит в том, чтобы выводить строки ввода дословно:

import sys

with open("a.txt") as f:
    for line in f:
        sys.stdout.write(line)

PS: для Python 3 (или Python 2 с функцией печати) решение abarnert print(…, end='') является самым простым.

Ответ 2

Как объясняют другие ответы, каждая строка имеет новую строку; когда вы print голая строка, она добавляет строку в конец. Существует два пути: все остальное является вариацией на те же две идеи.


Во-первых, вы можете разделить символы новой строки, когда будете их читать:

with open("a.txt") as f:
    for line in f:
        print line.rstrip()

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

with open("a.txt", "rU") as f:
    for line in f:
        print line.rstrip('\n')

Однако, если вы знаете, что текстовый файл будет, скажем, файлом Windows-новой строки, или файлом с исходным кодом, который может быть использован для работы в ядре, соответствующие окончания явно:

with open("a.txt") as f:
    for line in f:
        print line.rstrip('\r\n')

with open("a.txt") as f:
    for line in f:
        print line.rstrip(os.linesep)

Другой способ сделать это - оставить исходную новую строку и просто не печатать лишний. Хотя вы можете сделать это, написав sys.stdout с помощью sys.stdout.write(line), вы также можете сделать это с самого print.

Если вы просто добавили запятую в конец инструкции print, вместо печати новой строки, она добавляет "умное пространство". То, что это значит, немного сложно, но предполагается, что идея добавляет пространство, когда это нужно, и ничего, т. Как и большинство алгоритмов DWIM, это не всегда правильно, но в этом случае:

with open("a.txt") as f:
    for line in f:
        print line,

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

Во всяком случае, вы можете избежать магии интеллектуального пространства DWIM, используя функцию печати вместо оператора печати. В Python 2.x вы получите это, используя объявление __future__:

from __future__ import print_function
with open("a.txt") as f:
    for line in f:
        print(line, end='')

Или вы можете использовать стороннюю библиотеку-обертку, например six, если хотите.

Ответ 3

Что происходит, так это то, что каждая строка в качестве новой строки в конце и оператор print в python также добавляет новую строку. Вы можете разделить строки:

with open("a.txt") as f:
    for line in f:
        print line.strip()

Ответ 4

Вы также можете попробовать функцию splitlines(), она автоматически разбивается:

f = open('a.txt').read()
for l in f.splitlines():
    print l

Ответ 5

Он не добавляет новую строку, но каждая отсканированная строка из вашего файла имеет завершающий символ.

Try:

with open ("a.txt") as f:
    for line in (x.rstrip ('\n') for x in f):
        print line