Чтение обновляющегося файла

lorgon

Известный
Автор темы
656
271
У меня есть файл, который постоянно обновляется и в него добавляются строки. Как можно получать только те строки, которые добавились?
UPD: Одновременно может добавиться 2-е или более строки.
 
Решение
У меня есть файл, который постоянно обновляется и в него добавляются строки. Как можно получать только те строки, которые добавились?
UPD: Одновременно может добавиться 2-е или более строки.

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

Есть много вариантов решения, зависит от конкретной задачи, это один из простых, он не идеален в нём есть и свои недочёты, сделан...

Neon3333

Известный
181
71
У меня есть файл, который постоянно обновляется и в него добавляются строки. Как можно получать только те строки, которые добавились?
UPD: Одновременно может добавиться 2-е или более строки.
Хранить предыдущее состояние файла и сравнивать
 

NoN4m3

Участник
78
5
У меня есть файл, который постоянно обновляется и в него добавляются строки. Как можно получать только те строки, которые добавились?
UPD: Одновременно может добавиться 2-е или более строки.

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

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

Код проверен, срабатывает моментально.


Python:
import hashlib
from time import sleep

def getSHA256(filename):
    h  = hashlib.sha256()
    b  = bytearray(128*1024)
    mv = memoryview(b)
    with open(filename, 'rb', buffering=0) as f:
        for n in iter(lambda : f.readinto(mv), 0):
            h.update(mv[:n])
    return h.hexdigest()

def listToString(s):
    _s = ""
    for ele in s: _s += ele
    return _s

def readFile(filename):
    with open(filename) as f: lines = f.readlines()
    return listToString(lines)

filename = "default.txt"

_sha256 = getSHA256(filename)
_text = readFile(filename)

while True:
    if getSHA256(filename) != _sha256: # условие сработает если файл будет изменён
        _new = readFile(filename).replace(_text, "")
        print("New in file: " + _new)
        _sha256 = getSHA256(filename)
        _text = readFile(filename)
    sleep(0.15)
 
Последнее редактирование:
  • Нравится
Реакции: lorgon

lorgon

Известный
Автор темы
656
271
При запуске программы считать файл, и выписать его в переменную а также его хеш, после чего запустить цикл ожидания обновления, что-бы не тратить много времени на проверку, хешируй файл который надо проверить и сравнивай хешы, если хеш файла изменился - с помощью функции .replace() сделай замену и выпиши в другую переменную. Надеюсь помог, ниже будет пример, если будут вопросы - обращайся в ДС, он в профиле.

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

Код проверен, срабатывает моментально.


Python:
import hashlib
from time import sleep

def getSHA256(filename):
    h  = hashlib.sha256()
    b  = bytearray(128*1024)
    mv = memoryview(b)
    with open(filename, 'rb', buffering=0) as f:
        for n in iter(lambda : f.readinto(mv), 0):
            h.update(mv[:n])
    return h.hexdigest()

def listToString(s):
    _s = ""
    for ele in s: _s += ele
    return _s

def readFile(filename):
    with open(filename) as f: lines = f.readlines()
    return listToString(lines)

filename = "default.txt"

_sha256 = getSHA256(filename)
_text = readFile(filename)

while True:
    if getSHA256(filename) != _sha256: # условие сработает если файл будет изменён
        _new = readFile(filename).replace(_text, "")
        print("New in file: " + _new)
        _sha256 = getSHA256(filename)
        _text = readFile(filename)
    sleep(0.15)
Через эту библиотеку вряд ли получиться реализовать, но за идею - огромное спасибо!