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

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

14.10.2015, 23:06. Показов 4902. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru