чтение последней строки в файле журнала с помощью python [duplicate]

Id должен быть уникальным. Вместо этого вы должны использовать class, а затем использовать document.getElementsByClassName('className');

var video = document.getElementsByClassName('vid');
var myFunction = function() {
    // Reset the video to 
    this.currentTime = 0;
    // And play again
    this.load();
};

for (var i = 0; i < video.length; i++) {
    video[i].addEventListener('ended', myFunction, false);
}
36
задан JimS 24 March 2011 в 15:44
поделиться

5 ответов

Я не эксперт здесь, но я думаю, вам придется использовать какой-то шаблон наблюдателя, чтобы пассивно наблюдать за файлом, а затем отключить событие, которое снова откроет файл при возникновении изменения. Что касается того, как реализовать это, я понятия не имею.

Я не думаю, что open () откроет файл в реальном времени, как вы предлагаете.

1
ответ дан Adam Pointer 21 August 2018 в 06:07
поделиться

Вот немного измененная версия ответа Jeff Bauer , которая устойчива к усечению файлов. Очень полезно, если ваш файл обрабатывается с помощью logrotate.

import os
import time

def follow(name):
    current = open(name, "r")
    curino = os.fstat(current.fileno()).st_ino
    while True:
        while True:
            line = current.readline()
            if not line:
                break
            yield line

        try:
            if os.stat(name).st_ino != curino:
                new = open(name, "r")
                current.close()
                current = new
                curino = os.fstat(current.fileno()).st_ino
                continue
        except IOError:
            pass
        time.sleep(1)


if __name__ == '__main__':
    fname = "test.log"
    for l in follow(fname):
        print "LINE: {}".format(l)
4
ответ дан Community 21 August 2018 в 06:07
поделиться

«Интерактивный сеанс стоит 1000 слов»

>>> f1 = open("bla.txt", "wt")
>>> f2 = open("bla.txt", "rt")
>>> f1.write("bleh")
>>> f2.read()
''
>>> f1.flush()
>>> f2.read()
'bleh'
>>> f1.write("blargh")
>>> f1.flush()
>>> f2.read()
'blargh'

Другими словами - да, будет один «открытый».

13
ответ дан Jeff Bauer 21 August 2018 в 06:07
поделиться
  • 1
    Это интересно знать! – Adam Pointer 24 March 2011 в 16:57
  • 2
    Этот ответ должен быть принят – Quinma 20 November 2013 в 21:46
  • 3
    Я бы поддержал, если бы ответ содержал пример кода в терминах кода OP. – Chiel ten Brinke 1 May 2014 в 21:25
  • 4
    @ Chiel92: добавлен образец кода с сайта Дэвида Бизли – Jeff Bauer 2 May 2014 в 15:07
  • 5
    Этот ответ неверен, если писатель пишет строку в двух отдельных фрагментах, readline вернется дважды. Но вы действительно хотите только вернуть одну строку. – Fabian 18 July 2014 в 14:25
  • 6
    Не могу заставить его работать. Может быть, в Python 3? – Jason 1 November 2016 в 22:46

Поскольку вы ориентируетесь на систему Linux, вы можете использовать pyinotify , чтобы уведомить вас об изменении файла.

Также существует трюк который может работать хорошо для вас. Он использует file.seek для выполнения действий tail -f.

3
ответ дан nmichaels 21 August 2018 в 06:07
поделиться

Если у вас есть код, читающий файл, запущенный в цикле while:

f = open('/tmp/workfile', 'r')
while(1):
    line = f.readline()
    if line.find("ONE") != -1:
        print "Got it"

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

>>> f = open('/tmp/workfile', 'a')
>>> f.write("One\n")
>>> f.close()
>>> f = open('/tmp/workfile', 'a')
>>> f.write("ONE\n")
>>> f.close()
1
ответ дан w00t 21 August 2018 в 06:07
поделиться
  • 1
    Этот ответ также ошибочен, запись может быть разделена на «ON» и «E\n», что приведет к двум строкам, где не будет совпадений. – Fabian 18 July 2014 в 14:27
Другие вопросы по тегам:

Похожие вопросы: