Чтение только первой строки файла?


210

Как бы вы получили только первую строку файла в виде строки с Python?


4
Если вы уже прочитали файл («После чтения в файл»), вы уже прочитали первую строку! (Предполагая, что есть хотя бы одна строка.)
— Уильям Перселл

3
Обратите внимание, что вопрос в том виде, в котором он сейчас сформулирован, имеет другое значение, чем изначально. Некоторые ответы теперь выглядят глупо, поскольку они учитывают часть «после прочтения в файл» (которая была удалена).
— Питер Хансен

Ответы:


355

С помощью .readline()метода ( Python 2 документов , Python 3 документов ):

with open('myfile.txt') as f:
    first_line = f.readline()

Некоторые заметки:

  1. Как отмечено в документации, если это не единственная строка в файле, возвращаемая строка f.readline()будет содержать завершающий символ новой строки. Вы можете использовать f.readline().strip()вместо этого, чтобы удалить новую строку.
  2. withОператор автоматически закрывает файл снова , когда концы блока.
  3. Оператор withработает только в Python 2.5 и выше, а в Python 2.5 вам нужно использоватьfrom __future__ import with_statement
  4. В Python 3 вы должны указать кодировку файла для открываемого файла. Читать далее...

3
В Python 3, если файл ascii или utf8, вам не нужно указывать кодировку файла. И если это не так, вы все равно должны указать кодировку для codecs.open в Python 2.
— Евпок

2
@Evpok "В Python 3, если файл ascii или utf8, вам не нужно указывать кодировку файла" - если бы это было строго верно! Реальность немного более грязная; как отмечено в документации, используемая кодировка по умолчанию зависит от платформы (и может отличаться даже на том же компьютере в зависимости от того, как вы запускаете Python - например, я видел код, который работал на моей обычной оболочке, предполагая, что UTF-8 позже взорвется когда запускаешь через апач с mod_wsgi).
— Марк Эмери


20
fline=open("myfile").readline().rstrip()

Я пришел сюда в поисках этого. Тем более, что rstrip()удаляет символ новой строки.
— Шашанк Савант

5
-1; это не закрывает файл и возвращает неверный результат, если первая строка содержит любые пробелы, кроме самого символа новой строки.
— Марк Эмери

@MarkAmery: На самом деле, поскольку дескриптор файла не назначен переменной, он сразу же удаляется, что закрывает файл. (Хотя, конечно, принятое решение с использованием диспетчера контекста все еще намного лучше.)
— acdr

@acdr То, что вы говорите, верно для CPython, но не для других реализаций Python - см., например, документы по сборке мусора PyPy, в которых в качестве особого интереса упоминается, что «файлы ... не закрываются сразу после выхода из области видимости» . По этой причине обычно утверждается (например, на stackoverflow.com/a/7396043/1709587 ), что полагаться на поведение, которое вы описываете, является плохой практикой.
— Марк Амери


9

Чтобы вернуться к началу открытого файла и затем вернуть первую строку, сделайте следующее:

my_file.seek(0)
first_line = my_file.readline()

1
Просто для лучшего понимания, это будет "my_file.seek (0) line = my_file.readline ()"
— Альберто Перес


6

Здесь много других ответов, но чтобы точно ответить на заданный вами вопрос (до того, как @MarkAmery пошел и отредактировал исходный вопрос и изменил значение):

>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('\n', 1)[0]

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

Обратите внимание, что это не включает \nсимвол в конце строки, но я предполагаю, что вы все равно не хотите его (и однострочный файл может даже не иметь его). Также обратите внимание, что, хотя он довольно короткий и быстрый, он делает копию данных, поэтому для действительно большого куска памяти вы можете не считать его «эффективным». Как всегда, это зависит ...


8
Если это большой файл, f.read () попытается загрузить весь файл в память, что не будет хорошей идеей. Альтернативой может быть чтение по одному символу за раз до появления новой строки или EOF
— randomThought

На самом деле, все остальные ответы являются лучшими альтернативами, чем это. Обычно при чтении файла с помощью readline () и друзей загружаются целые блоки за раз, может быть, 32K дают или беру, и выполняют поиск по ним, чтобы найти следующую новую строку. Намного быстрее и эффективнее. Мой ответ будет полезен только в том случае, если он уже загружает все это, и в этом случае мы можем предположить, что он в порядке, имея все это в памяти.
— Питер Хансен

2
Я не уверен, что я изменил значение. Довольно бессмысленно спрашивать, как «прочитать» первую строку из файла после «чтения» всего файла. Таким образом , это довольно очевидно для меня , что намерение Аскер было не предположить , что .read()должно быть названо первым.
— Марк Эмери

@MarkAmery, вопрос был сформулирован плохо («довольно бессмысленно»), поэтому вы догадались о намерении («очевидно для меня») и перефразировали его для соответствия. Моя интерпретация отличается. Ясно , что до тех пор, пока harpalss проясняет, все мы не оригинальная формулировка плюс его принятие ответа (т.е. «искать (0)») , который мне ясно показывает , что он был уже прочитать в файле, по крайней мере , мимо первой линии.
— Питер Хансен

Вы должны удалить этот ответ. это не правильный путь и может обманывать людей.
— Тханг

-15
f1 = open("input1.txt", "r")
print(f1.readline())

20
Есть много ответов старше пяти лет, содержащих именно этот подход . Вы ничего не делаете, но создаете шум, добавляя еще один.
— Марк Амери
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.