2013-08-03 3 views
10

Входной файл: a.txtPython добавляет дополнительный символ новой строки к выходу

aaaaaaaaaaaa 
bbbbbbbbbbb 
cccccccccccc 

код питона:

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

Проблема:

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

bbbbbbbbbbb 

cccccccccccc 

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

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

ответ

12

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

Стандартное решение для вывода входных линий стенографические:

import sys 

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

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

+0

OP явно использует Python 2, и я не уверен, что предложение 'print_function' для пользователей 2.x всегда является хорошей идеей. И использование магического мягкого пространства 'print', вероятно, является плохой идеей, если вы не впервые узнаете, что это значит и как это работает. Это означает, что ваш явный 'write' может быть лучшим ответом (поэтому я поддержал ваш ответ и думаю, что OP был прав, чтобы принять его). – abarnert

+0

REF https://docs.python.org/2/library/functions.html#print –

0

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

Try:

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

Это не удается в Windows (или Mac OS до OS X), потому что символ новой строки не является '\ n'. – EOL

+1

Это также не удается, если файл a.txt не существует. – Hyperboreus

+1

@EOL AFAIK, и я, возможно, ошибаюсь, файлы, открытые в текстовом режиме в python, имеют все свои строки-строки, которые неявно преобразуются в '\ n'. – Hyperboreus

2

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

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

'strip()' также удаляет ведущие пробелы, поэтому это решение не может правильно напечатать входной файл, когда он содержит строки, начинающиеся с пробелов. Вы действительно хотите 'rstrip()'. Даже 'rstrip()' не так хорош: он удаляет новые строки (что хорошо), но также и конечные пробелы, которые каким-то образом не позволяют изменить строки входного файла, поэтому даже версия 'rstrip()' полностью выполнить то, что необходимо. – EOL

1

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

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

Хотя это правильно обрабатывает различные соглашения новой строки для нескольких операционных систем, как в Python 2, так и в Python 3 это решение может занимать много памяти : не только весь файл считывается в памяти, но и копируется по списку его строк. Таким образом, это метод, который работает, но только для файлов, которые не слишком велики.Обратите внимание, что в конечном итоге память будет освобождена, если в этом решении используется 'with', как в некоторых других ответах. – EOL

+0

@EOL: 'with' не повлияет на освобождение памяти. Независимо от того, закрываете ли вы файл или нет, гигантская строка 'f' работает в реальном времени ровно столько же времени в любом случае. (Конечно, по-прежнему неплохо было бы не терять файлы. Это просто не относится к GC'ing 'f' или' f.splitlines'.) – abarnert

+0

@abarnert: Вы правы. Я не уверен, почему я написал, что память будет освобождена с помощью 'with' (вовлеченная сумма памяти действительно незначительна). – EOL

6

Как и другие ответы объяснить, каждая строка имеет символ новой строки; когда вы 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, символ новой строки файла, или уроженцем к -whichever-платформа-я-обкатка на правой теперь новой строки файла, вы можете раздеться соответствующие окончаний в явном виде:

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, вместо печати новой строки она добавляет «умное пространство». Exactly what that means немного сложнее, но предполагается, что он добавляет пространство, когда ему нужно, и ничего, когда этого не должно быть. Как и большинство алгоритмов DWIM, это не всегда получается все правильно, но в этом случае он делает:

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

Конечно мы теперь предположить, что новые строки файла соответствуют вашему terminal's-если вы попробуете это, скажем, классические файлы 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, если вы предпочитаете.

+0

stripping '\ r' бесполезен, потому что вы открыли файл в текстовом режиме: символ' \ r' удален _before_ вам нужно его разбить. Полезно только для python 2 и двоичного режима для текстовых файлов (несовместимо с python 3) –