- Как прочитать последнюю строку в файле на python?
- Получить последнюю строку из файла
- Как прочитать из файла только последние 30 строк?
- Python-сообщество
- #1 Ноя. 24, 2010 13:47:42
- Быстрый способ прочитать последнюю строку в файле
- #2 Ноя. 24, 2010 16:03:44
- Быстрый способ прочитать последнюю строку в файле
- #3 Ноя. 24, 2010 17:44:24
- Быстрый способ прочитать последнюю строку в файле
- #4 Ноя. 24, 2010 21:52:39
- Быстрый способ прочитать последнюю строку в файле
- #5 Ноя. 25, 2010 13:11:25
- Быстрый способ прочитать последнюю строку в файле
- #6 Ноя. 26, 2010 01:57:37
- Быстрый способ прочитать последнюю строку в файле
- #7 Ноя. 26, 2010 08:59:53
- Быстрый способ прочитать последнюю строку в файле
- #8 Ноя. 26, 2010 17:38:03
- Быстрый способ прочитать последнюю строку в файле
- #9 Ноя. 26, 2010 22:54:33
- Быстрый способ прочитать последнюю строку в файле
- #10 Ноя. 26, 2010 23:06:52
- Быстрый способ прочитать последнюю строку в файле
Как прочитать последнюю строку в файле на python?
@ fidel Вы можете использовать функцию tail из библиотеки os для чтения последней строки в файле.
Ниже приведен пример кода, который открывает файл filename.txt , считывает последнюю строку и выводит ее на экран:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
import os def tail(f, lines=1, _buffer=4098): """Tail a file and get X lines from the end""" # place holder for the lines found lines_found = [] # block counter will be multiplied by buffer # to get the block size from the end block_counter = -1 # loop until we find X lines while len(lines_found) lines: try: f.seek(block_counter * _buffer, os.SEEK_END) except IOError: # either file is too small, or too many lines requested f.seek(0) lines_found = f.readlines() break lines_found = f.readlines() # we found enough lines, get out if len(lines_found) > lines: break # decrement the block counter to get the # next X bytes block_counter -= 1 return lines_found[-lines:] # Открыть файл with open('filename.txt', 'r') as f: # Get the last line last_line = tail(f)[0] # Вывести последние строки print(last_line)
Этот код открывает файл в режиме чтения ( ‘r’ ) и использует функцию tail для считывания последней строки. После чтения строка выводится на экран с помощью функции print .
Получить последнюю строку из файла
Есть файл с произвольным количеством строк, нужно получить последнюю строку этого файла, и записать её в новый файл.
Но я даже не смог получить последнюю строку. Нашел такое решение, но у меня и это не заработало.
with open("1.log", "r") as file: lines=file.readlines() print(lines[-1])
Как получить последнюю строку из файла
Добрый день. Есть log-файл log.cgi.txt Из него необходимо получить последнюю строку, но ошибка.
Дан текстовый файл. Вставить в начало файла его последнюю строку, а в конец первую строку.
Помогите решить задание, заранее спасибо. Дан текстовый файл. Вставить в начало файла его.
Получить последнюю строку из текста
нужно получить последнюю строку из предложенного текста..Например: вася ходил гулять петя упал.
Как получить последнюю строку из textbox?
Нужно как то вытащить самую последнюю строку из textbox. Как это сделать?
Как получить последнюю строку консоли?
Как получить последнюю строку консоли?
Как прочитать из файла только последние 30 строк?
Вопрос лаконичный, нужен аналогичный ответ 🙂
Задача — получить статистику из 100500 лог-файлов, размером по 1-30 Мб.
Для ускорения процесса, считаю целесообразным читать только 30 последних строк в файле, которые содержат всю необходимую мне информацию.
Как это сделать на Python?
import os r = os.system("tail -n 30 /path/error.log") print(r)
Да да. ведь Python это не что иное как вычурный способ запускать бородатые утилиты в баш..
seek() ? не не слышал. а вообще, лучше через python сохранить текстовый файл с си кодом, а потом через python запустить компилятор. ой постойте..
Получить размер файла.
Открыть файл.
Зная размер файла сделать seek в конец.
Считывать файл посимвольно с конца до 30-ти переводов строк.
Для этого есть готовая команда tail tail -n 30 mylog.log
from collections import deque with open(file_name) as f: print(list(deque(f, 30)))
with open(file_name) as f: for row in deque(f, 30): print (row.strip())
Первой строчкой вы открываете файл целиком, или я ошибаюсь? Взять из уже открытого файла последние строки — не проблема. Вопрос был в другом.
Igor Nikolaev: и как же вы собираетесь что то взять из закрытого файла?
Пока его не откроешь, это всего лишь намагниченные участки на блине HDD.
Если найдете способ получить чтото из файла, не открывая его, получите Нобелевскую премию.)))
У вас видимо серьезные пробелы в базовых знаниях.
Когда мы «открываем» файл, мы получаем к нему доступ, и работаем с ним через его хэндл.
Igor Nikolaev: вот ТУТ:
stackoverflow.com/questions/136168/get-last-n-line.
люди мучали самое быстрое считывание последних строк.
Можете поэкспериментировать. Библиотеки питона это скомпилированный быстрый код на С, при работе с файлами уж точно. И вряд ли вы напишите что-то эффективней разработчиков.
andrey_ado: Так я не пытаюсь 🙂 Я ставил конкретный вопрос — как решить мою задачу. Я совсем новичок и только учусь. Спасибо за ссылку.
Igor Nikolaev: я тоже не профи, и на питоне пишу недавно. В знаниях вперед нас двигают задачи, вопросы и ответы. Удачи.
Python-сообщество
- Начало
- » Python для новичков
- » Быстрый способ прочитать последнюю строку в файле
#1 Ноя. 24, 2010 13:47:42
Быстрый способ прочитать последнюю строку в файле
Собственно столкнулся с сабжем. Для парсера нужно читать последнюю строку из файла, что бы можно было продолжить работу сто старого места. Файл большой 15 — 20 кк строк.
Дядя Гугл сказал, что встроенного метода решения проблемы — нет:
— Либо прочитать весь файл readlines и взять последнюю строку (быстро, но всю память съест ).
— Либо пробежать весь файл xreadlines и опять таки взять последнюю строку (память останется целой, но каждый раз ждать пока переберется весь файл).
Короче — не один вариант не подходит. Пришлось идти самым примитивным путем, перебирать каждый символ с конца файла и при совпадении его с символом конца строки — выводить. Но код у меня получился страшноватый:) Может кто подправит или расскажет как он делает?
myIter = 1
with open("myfile") as f:
while 1:
myIter += 1
f.seek(-myIter, 2)
sim = f.read(1)
if sim == u'\n':
res = f.readline().rstrip()
break
print res
#2 Ноя. 24, 2010 16:03:44
Быстрый способ прочитать последнюю строку в файле
Вполне нормальный код. Думаю, достаточно будет сделать из него функцию.
#3 Ноя. 24, 2010 17:44:24
Быстрый способ прочитать последнюю строку в файле
🙂
Лучше читать блоками, а не по одному байту.
Зачем перечитывать строку, которую уже считал?
Вариации на тему:
s = ''
cur_block_size = block_size = 1024
with open('users.txt') as f:
while True:
f.seek(-1*cur_block_size, 2)
s = f.read(block_size) + s
res = s.split('\n')
if len(res) > 2:
print res[-2]
break
cur_block_size += block_size
#4 Ноя. 24, 2010 21:52:39
Быстрый способ прочитать последнюю строку в файле
ofigetitelno
🙂
Лучше читать блоками, а не по одному байту.
Зачем перечитывать строку, которую уже считал?
Видел подобное решение (или такое же) в нете. Но у меня строки состоят из ‘nickname:id’, то есть небольшие; И считывать посимвольно — вполне себя окупает. Да и логика (имхо) попроще. Сначала сделал без повторного считывания всей строки. Каждый символ аппендил в список, а потом объединял его в строку, но было громоздко уж очень.
А с повторным считыванием вышло поменьше кода, но все равно как-то не очень элегантно:)
#5 Ноя. 25, 2010 13:11:25
Быстрый способ прочитать последнюю строку в файле
Вот мой вариант. По-моему элегантно =D
from itertools import repeat
def reverse_readline (f_path):
f = open(f_path, 'r')
f.seek(0, 2)
it = ( '' if f.tell() == 1 else (f.seek(-2, 1) or f.read(1)) for i in repeat(None))
while True:
st = ''
for ch in it:
if ch == '': raise StopIteration()
if ch == '\n': break
else: st = ch + st
yield st
PS Предыдущие свои сообщения удалил, чтобы не засорять эфир 🙂
Отредактировано (Ноя. 25, 2010 13:18:50)
#6 Ноя. 26, 2010 01:57:37
Быстрый способ прочитать последнюю строку в файле
#7 Ноя. 26, 2010 08:59:53
Быстрый способ прочитать последнюю строку в файле
Каков подлец! =D Спасибо за замечание
def read_last(f_path):
f = open(f_path, 'r')
f.seek(0, 2)
it = ( '' if f.tell() == 1 else (f.seek(-2, 1) or f.read(1)) for i in repeat(None))
while True:
st = ''
for ch in it:
if ch == '\n' or not ch: break
else: st = ch + st
yield st
if not ch: raise StopIteration()
#8 Ноя. 26, 2010 17:38:03
Быстрый способ прочитать последнюю строку в файле
Такая задача часто встречается во всяких логах. Файл длинный сообщений много, но их круг ограничен. Решить задачу значительно проще если сделать дополнительные предположения. В данном случае можно декларировать что длина строки не более MAX_ROW. Тогда будет еще красивее и эффективнее
import os
def LastRow(fileName,MAX_ROW=200):
"""отдать последнюю строку файла"""
with open(fileName,"rb") as f:
f.seek(-min(os.path.getsize(fileName),MAX_ROW),2)
return (f.read().splitlines())[-1]
кстати — все открывают файл в текстовом режиме — в доке написано: seek для текстовых файлов дает непредсказуемый результат.
Отредактировано (Ноя. 26, 2010 17:38:53)
#9 Ноя. 26, 2010 22:54:33
Быстрый способ прочитать последнюю строку в файле
Из документации к seek: If the file is opened in text mode (without ‘b’), only offsets returned by tell() are legal. Use of other offsets causes undefined behavior.
Дословно: Если файл открыт в текстовом режиме (без ‘b’), правомерны только отступы, возвращаемые tell(). Использование прочих отступов вызывает неопределенное поведение.
Какая-то мутная фраза, но уж точно не эквивалентна seek для текстовых файлов дает непредсказуемый результат . Или у вас другой текст? Можно ссылку?
Смотрим tell: Return the file’s current position, like stdio‘s ftell().
Смотрим stdio‘s ftell() (в GNU libc): This function can fail if the stream doesn’t support file positioning, or if the file position can’t be represented in a long int, and possibly for other reasons as well. If a failure occurs, a value of -1 is returned.
Мой вывод: поведение не определено в случае, если отступ превышает long int в С-компиляторе, на котором собран Ваш python.
#10 Ноя. 26, 2010 23:06:52
Андрей Светлов От: Зарегистрирован: 2007-05-15 Сообщения: 3137 Репутация: 14 Профиль Адрес электронной почты
Быстрый способ прочитать последнюю строку в файле
Несмотря на то, что файл открыт в символьном режиме seek и tell оперируют байтовыми смещениями.
Рассмотрим следующую ситуацию: файл в utf-8 с русскими буквами и переводом строки в unix стиле.
В этом случае можно “прыгать” только на начала символов. Т.е. если содержимое файла начинается с
Русский файл
Вторая строка файла
то правильные позиции сначала будут четными. Затем идет ‘\n’ — 1 байт. И снова двухбайтные символы.
Попытка позиционироваться внутрь символа собьет к чертям все что можно — так делать нельзя.
И угадать в общем случае невозможно — как я показал выше, длина символа может меняться.
Поэтому прыгать можно только на ранее полученные позиции.
Именно об этом и говорит документация.