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

210

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

harpalss
источник
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()
ghostdog74
источник
Я пришел сюда в поисках этого. Тем более, что rstrip()удаляет символ новой строки.
Шашанк Савант
5
-1; это не закрывает файл и возвращает неверный результат, если первая строка содержит любые пробелы, кроме самого символа новой строки.
Марк Эмери
@MarkAmery: На самом деле, поскольку дескриптор файла не назначен переменной, он сразу же удаляется, что закрывает файл. (Хотя, конечно, принятое решение с использованием диспетчера контекста все еще намного лучше.)
acdr
@acdr То, что вы говорите, верно для CPython, но не для других реализаций Python - см., например, документы по сборке мусора PyPy, в которых в качестве особого интереса упоминается, что «файлы ... не закрываются сразу после выхода из области видимости» . По этой причине обычно утверждается (например, на stackoverflow.com/a/7396043/1709587 ), что полагаться на поведение, которое вы описываете, является плохой практикой.
Марк Амери
9

Это должно сделать это:

f = open('myfile.txt')
first = f.readline()
Джаррет Харди
источник
9

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

my_file.seek(0)
first_line = my_file.readline()
дан-GPH
источник
1
Просто для лучшего понимания, это будет "my_file.seek (0) line = my_file.readline ()"
Альберто Перес
7
first_line = next(open(filename))
hoju
источник
1
Это также закрывает файл?
октября
В конце концов, когда Python покидает блок.
vy32
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())
Zwon
источник
20
Есть много ответов старше пяти лет, содержащих именно этот подход . Вы ничего не делаете, но создаете шум, добавляя еще один.
Марк Амери