Читати лише перший рядок файлу?


208

Як би ви отримали лише перший рядок файлу у вигляді рядка з Python?


4
Якщо ви вже прочитали файл ("Після читання у файлі"), ви вже прочитали перший рядок! (Якщо припустити, щонайменше один рядок.)
Вільям Перселл

3
Зауважте, що питання , яке зараз формулюється, має інше значення, ніж це було спочатку. Деякі відповіді зараз виглядають нерозумно, оскільки вони врахували частину "після читання у файлі" (яку було видалено).
Пітер Хансен

Відповіді:


354

Скористайтеся .readline()методом ( Python 2 docs , Python 3 docs ):

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 пізніше вибухне при запуску через Apache з mod_wsgi).
Марк Амері


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

Я прийшов сюди шукати цього. Тим більше, що rstrip()видаляє символ нового рядка.
Шашанк Сован

5
-1; це не закриває файл і повертає неправильний результат, якщо перший рядок містить будь-який пробільний пробіл, окрім самого символу нового рядка.
Марк Амері

@MarkAmery: Насправді, оскільки обробка файлу не призначена змінній, це негайно зібране сміття, яке закриває файл. (Хоча, звичайно, прийняте рішення за допомогою менеджера контексту все ще набагато краще.)
Акдр,

@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]

Іншими словами, якщо ви вже читали у файлі (як ви вже сказали), і у вас є великий блок даних у пам'яті, то щоб отримати перший рядок з нього ефективно, зробіть розділення () на символі нового рядка, один раз лише, і візьміть перший елемент із отриманого списку.

Зауважте, що це не включає \nсимвол у кінці рядка, але я припускаю, що ви його все одно не хочете (а однорядний файл може навіть не мати його). Також зауважте, що, хоча вона досить коротка і швидка, вона робить копію даних, тому для дійсно великої кількості пам'яті ви не можете вважати це "ефективним". Як завжди, це залежить ...


8
Якщо це великий файл, f.read () спробує завантажити весь файл у пам'ять, що не було б гарною ідеєю. Альтернативою було б читати по одному символу за раз, поки не зустрінеться новий рядок або EOF
randomThought

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

2
Я не переконаний, що змінив значення. Досить безглуздо запитувати, як "прочитати" перший рядок з файлу після "читання" всього файлу. Як таке, мені цілком очевидно, що намір претендента був не припускати, що його .read()потрібно викликати першим.
Марк Амері

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

вам слід видалити цю відповідь. це не правильний шлях і може обдурити людей.
thang

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

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