С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24

Чтение постоянно записываемого файла

14.10.2015, 23:06. Показов 4871. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
написал некий код, который в случае обнаружения в строке набор символ отправляет запрос. Также помимо чтения лога, код считывает обновления запросом, все в одном цикле.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def main():
    logger.info('Starting up')
    with open(filePath,'r') as f:
        while True:
            line = f.readline()
            if not line:
                break
            lastLine = line
    while (True):
        with open(filePath,'r') as f:
            lines = f.readlines()
        if lines[-1] != lastLine:
            lastLine = lines[-1]
            if 'ERROR' in lines[-1]:
                print('USER ROOT')
                for chid in ts_list:
                    sendMessage(chid, lines[-1])
            print(lines[-1])
        r = getUpdates(update_id+1,None, None)
        asyncore.loop()
Но так как такой подход является блокирующим, он мне не подходит, решил переписать используя не блокирующий os.read таким способом:
Python
1
2
3
4
5
6
7
8
fd = os.open('/var/log/auth.log', os.O_RDONLY|os.O_NONBLOCK)
    buff = ''
    while (True):
        buf = os.read(fd, 1024)
        if len(buf) == 0:
            break
        buff += buf
    strings = buff[1:].split("\x00")
Но столкнулся с тем, что в первом случае я мог просто вывести строку, а тут я не знаю как отделить строку от остального текста
Вывод получается таким:
Python
1
Oct 14 05:06:10 freya su[40701]: pam_unix(su:session): session opened for user root by maffa(uid=0)\nOct 14 05:06:13 freya su[40701]: pam_unix(su:session): session closed for user root\nOct 14 05:06:13 freya sudo: pam_unix(sudo:session): session closed for user root\nOct 14 05:06:53 freya sudo:    maffa : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/bin/su\nOct 14 05:06:53 freya sudo: pam_unix(sudo:session): session opened for user root by maffa(uid=0)\nOct 14 05:06:53 freya su[40753]: Successful su for root by root\n
т.е. строки разделены символом \n, но я не могу понять как брать нужную мне строку от \n до \n

И еще вопрос на засыпку, каким образом можно читая файл запоминать место на котором остановился в прошлый раз чтобы потом продолжить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.10.2015, 23:06
Ответы с готовыми решениями:

Можно ли в названии записываемого/считываемого файла использовать переменную?
Здравствуйте. Столкнулся с казалось бы несложной проблемой, но решения уже давно не могу найти. Пользую Python_3.7.2.rc1 win32. ...

Изменение записываемого файла
Программа постоянно записывает некоторые значения в файл с именем "file1.txt". При выполнении некоторого условия значения должны начать...

Ограничение на размер записываемого файла
Добрый день, есть такая проблема: программа пишет данные в файл, нужно сделать чтобы при достижении 300 кб она начинала писать новый файл в...

14
 Аватар для ivlevdenis
21 / 34 / 14
Регистрация: 23.07.2014
Сообщений: 148
15.10.2015, 02:50
str.split('\n')
0
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24
15.10.2015, 10:17  [ТС]
тут тогда получается так:
Python
1
strings = buff[0:].split("\n")
И в таком случае дальше я имею дело с листом, с каждой отдельной строкой.

Но можно ли каким либо образом обрабатывать именно буфер на наличие вхождения текста, без дополнительных преобразований?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
15.10.2015, 11:58
а чем вам не нравится работать с листом?
0
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24
15.10.2015, 12:55  [ТС]
Не то, чтобы не нравится. Просто не могу придумать алгоритм поиска по строке в листе, если по элементу листа просто индексом можно, тот тут не так просто.

Добавлено через 42 минуты
Хотя оказалось все проще:
Python
1
2
3
    for str in strings:
        if 'sudo:session' in str:
            print(i)
Остается вопрос: Каким образом можно читая файл запоминать место на котором остановился в прошлый раз чтобы потом продолжить?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
15.10.2015, 12:57
Цитата Сообщение от creonz Посмотреть сообщение
Хотя оказалось все проще
именно так и имелось ввиду

Цитата Сообщение от creonz Посмотреть сообщение
Каким образом можно читая файл запоминать место на котором остановился в прошлый раз чтобы потом продолжить?
tell()
0
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24
15.10.2015, 13:59  [ТС]
Да но, в случае использования os.read вариант с tell не подходит
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
15.10.2015, 13:59
а так? (не уверен, что сохранится nonblock, проверьте)
Python
1
2
3
4
5
6
7
import os
 
fd = os.open('megaclisas.txt', os.O_RDONLY|os.O_NONBLOCK)
fo = os.fdopen(fd)
line = os.read(fd, 10)
print('line = ', line, '\nposition: ', fo.tell())
fo.close()
1
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24
15.10.2015, 14:11  [ТС]
В таком случае позиция будет всегда 0, т.к. Вы читаете сам файл, а позицию смотрите по дескриптору (вроде правильно назвал). Я думаю, что тут можно использовать запоминание последнего буффера, и сравнивать его.
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
15.10.2015, 14:14
я попробовал:

Python
1
2
3
4
5
6
7
8
9
import os
 
fd = os.open('filename.txt', os.O_RDONLY|os.O_NONBLOCK)
fo = os.fdopen(fd)
line = os.read(fd, 10)
print('line = ', line, '\nposition: ', fo.tell())
line = os.read(fd, 10)
print('line = ', line, '\nposition: ', fo.tell())
fo.close()
вывод:
Code
1
2
3
4
line =  b'c0u0p0 | W' 
position:  10
line =  b'D-WCC13019' 
position:  20
позиция сохраняется.
1
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24
15.10.2015, 16:52  [ТС]
Python
1
2
3
4
5
logfile = os.open(tl_file, os.O_RDONLY|os.O_NONBLOCK)
fo = os.fdopen(logfile)
    while (True):
          buf = os.read(fd, 1024)
          print(fo.tell())
Каждый раз выводит ноль, попробовал скрипту выше подкладывая свой файл, тоже самое.

Но мне кажется такой способ не подходит. Сейчас мне надо читать файл, и если в нем нет обновления переходить дальше, поэтому думаю сравнивать по последней строке в уже собранном листе, с первой строкой в полученном листе. Такая идея может сработать?
И еще, я задумался о том, что буфер ведь может переполнится или быть просто огромным за долгое время работы, получается его надо как то очищать.
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
15.10.2015, 17:05
Цитата Сообщение от creonz Посмотреть сообщение
while (True):
что с отступом, откуда там 4 пробела?
На следующей строке их вообще 6.
зачем True - в скобках?

Цитата Сообщение от creonz Посмотреть сообщение
buf = os.read(fd, 1024)
откуда fd взялось?
1
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24
15.10.2015, 17:10  [ТС]
Кривовато вставил
Python
1
2
3
4
5
logfile = os.open(tl_file, os.O_RDONLY|os.O_NONBLOCK)
    fo = os.fdopen(logfile)
    while True:
        buf = os.read(logfile, 1024)
        print(fo.tell())
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
15.10.2015, 17:24
я недавно тоже кому-то писал кусочек кода, чтобы дочитывать файл по мере его записи

Python
1
2
3
4
5
6
7
8
9
10
11
import datetime
import time
 
with open('logs.txt', 'r') as f:
    while True:
        line = f.readline()
        if line:
            print(datetime.datetime.now().strftime('%H:%M:%S'), line.strip())
        else:
            print("Nothing else found in the file, waiting... Position: ", f.tell())
            time.sleep(5)
пруфлинк, йа видеооператор! :)
1
1 / 1 / 0
Регистрация: 29.05.2013
Сообщений: 24
16.10.2015, 12:51  [ТС]
В моем исполнении, но гифкой :)

Кусочек кода дочитывающего файл верный, редлайны замечательный выход, там можно и строку запоминать, и каких вариантов только не делать. Но не в моем варианте с os.read, пока думаю как сделать правильно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2015, 12:51
Помогаю со студенческими работами здесь

меняющиеся название записываемого файла
TStringList * listR = new TStringList(); for (int i = 0; i < k; i++) { // здесь я заполняю этот listR цифрами } ...

Постоянно прерывается чтение голосом книг
Использую для чтения eReader Prestigio или Яндекс. Читалка. Раньше всё было хорошо, неделю назад начались какие-то глюки с работой....

Увеличить громкость записываемого звука
Доброго времни суток! Имеется задача записать звук с микрофона и свести его с каким-нибудь саундтреком. Записываю звук через...

Битрейт для записываемого видео с использованием кодеков
Всем привет) Записываю видео. Есть Видео-кодеки: FLV1 H263P MPEG2 MPEG4 MSMPEG4v2 MSMPEG4v3 Raw

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать обычную программу для расчета некоторых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru