Как прочитать файл без перевода строки?

374

В Python звоню

temp = open(filename,'r').readlines()

в результате получается список, в котором каждый элемент является строкой в ​​файле. Это немного глупо, но все же: я readlines()также пишу символ новой строки для каждого элемента, чего я не желаю.

Как я могу избежать этого?

Yotam
источник
4
Использование полосы: [l.strip('\n\r') for l in temp]. Или даже rstrip. И с итерации здесь это может быть in openвместо in temp.
gorlum0
11
Было бы неплохо, если бы в Python 3 было значение для установки newlineаргумента open для этого разбитого конечного символа новой строки.
jxramos
Связанный: stackoverflow.com/questions/275018/…
AMC

Ответы:

555

Вы можете прочитать весь файл и разделить строки, используя str.splitlines:

temp = file.read().splitlines()

Или вы можете удалить новую строку вручную:

temp = [line[:-1] for line in file]

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

Это предположение верно в большинстве случаев (особенно для файлов , созданных с помощью текстовых редакторов, которые часто делают добавить окончание новой строки в любом случае).

Если вы хотите избежать этого, вы можете добавить новую строку в конце файла:

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # go at the end of the file
    if f.read(1) != '\n':
        # add missing newline if not already present
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

Или более простая альтернатива stripвместо новой строки:

[line.rstrip('\n') for line in file]

Или даже, хотя довольно нечитаемо

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

Который использует тот факт, что возвращаемое значение orне является логическим значением, но объект, который был оценен как истина или ложь.


readlinesМетод фактически эквивалентно:

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines

# or equivalently

def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

Так как readline()сохраняет перевод строки, также readlines()сохраняет его.

Примечание: для симметрии к readlines()в writelines()методе вовсе не добавлять окончания перевода строки, поэтому f2.writelines(f.readlines())производит точную копию fв f2.

Bakuriu
источник
1
Обратите внимание, что [line.rstrip('\n') for line in file]удалит более одного трейлинг \n.
Уэс Тернер
1
Проще говоря, [line[:-(line[-1] == '\n') or len(line)+1] for line in file]могло бы быть [line[:-(line[-1] == '\n') or None] for line in file].
Уэс Тернер
10
Эти решения читают весь файл в память. Смена квадратных скобок списка в круглых скобках создает выражение-генератор, которое позволяет перебирать файл по одной строке за раз: for line in (x.strip() for x in f):
Джозеф Шиди,
2
@velotron Это не совсем вопрос / ответ. Кроме того: имейте в виду, что withпри завершении блока файлы закрываются, что означает, что вы не можете делать with open(...) as f: lines = (line for line in f)и использовать linesвне, withпотому что вы получите ошибку ввода-вывода. Вы можете быть ленивым, используя genexp, но вы должны использовать его перед закрытием файла.
Бакуриу
@WesTurner. Но не будет больше одного трейлинга. Дополнительный символ новой строки будет частью следующей пустой строки
Безумный физик
38
temp = open(filename,'r').read().split('\n')
Вивек
источник
14
Что будет с \r\nпереводом строки? ;)
Wolph
26
Python автоматически обрабатывает универсальные новые строки, поэтому .split('\n')будет корректно разбиваться независимо от соглашения о новой строке. Было бы важно, если вы читаете файл в двоичном режиме. В этом случае splitlines()обрабатывает универсальные символы новой строки, а split('\n')не.
Бакуриу
7
И всегда есть os.linesep:)
Askewchan
1
@LarsH, в некоторых случаях это помогло бы, если бы в моей системе \r\nокончания строк не преобразовывались \nв текстовые или двоичные, os.linesepто работали бы там, где \nэто не так. Но splitlines, очевидно, это лучший выбор, если вы упомянули, где файл не соответствует ОС. На самом деле я в основном упоминал об этом на тот случай, если люди, смотрящие на это обсуждение, не знали о его существовании.
Askewchan
1
@askewchan Возможно, вы используете устаревшую версию Python. Я считаю, что в Python 3 универсальные переводы строки включены по умолчанию, то есть \r\nбудут преобразованы для текстовых файлов, даже если вы работаете в Linux.
Артур Такка
13

другой пример:

Чтение файла по одной строке за раз. Удаление нежелательных символов с конца строкиstr.rstrip(chars)

with open(filename, 'r') as fileobj:
    for row in fileobj:
        print( row.rstrip('\n') )

смотри также str.strip([chars])иstr.lstrip([chars])

(python> = 2.0)

О-9
источник
10
temp = open(filename,'r').read().splitlines()
завивать волосы щипцами
источник
5
Вы уверены, что это закрывает файл? Я думаю, что это не так, так что на самом деле это не однострочник ...
Рэй
9

Я думаю, что это лучший вариант.

temp = [line.strip() for line in file.readlines()]
RENZO
источник
8
Это решение также удаляет начальные и конечные пробелы, которые не предназначены.
Роланд Иллиг
Понимание действительно хорошее, хотя. По крайней мере, в Python 3 можно использовать temp = [line.rstrip() for line in file.readlines()]то, что предназначено для заметок @Roland_Illig.
bballdave025
Если вы собираетесь перебирать все строки, почему бы не так лениво? При этом .readlines()вы эффективно перебираете весь файл дважды.
AMC
1

Попробуй это:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  
Нитеш Сони
источник
4
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код. Также постарайтесь не переполнять ваш код пояснительными комментариями, так как это снижает удобочитаемость кода и пояснений!
До свидания, StackExchange,
Я не понимаю, почему кто-то должен использовать это над некоторыми из альтернативных решений.
AMC
-1
my_file = open("first_file.txt", "r")
for line in my_file.readlines():
    if line[-1:] == "\n":
        print(line[:-1])
    else:
        print(line)
my_file.close() 
Necriss
источник
3
Пожалуйста, добавьте некоторые объяснения, чтобы они были полезны для других.
Самуэль Лаврентц
Вы должны использовать менеджер контекста для обработки файлового объекта и перебора файла напрямую. Используя .readlines()это, вы эффективно перебираете весь файл дважды.
AMC
-2
import csv

with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])
SRU,
источник
2
Но что, если в строке есть запятая?
Гилх
-8
def getText():
    file=open("ex1.txt","r");

    names=file.read().split("\n");
    for x,word in enumerate(names):
        if(len(word)>=20):
            return 0;
            print "length of ",word,"is over 20"
            break;
        if(x==20):
            return 0;
            break;
    else:
        return names;


def show(names):
    for word in names:
        len_set=len(set(word))
        print word," ",len_set


for i in range(1):

    names=getText();
    if(names!=0):
        show(names);
    else:
        break;
user4730171
источник