Форум сайта python.su
0
Доброго времени.
Задача: парсинг больших лог файлов (в несколько Гб).
В скрипте задаю пул нужных адресов (переменная pull). Обрабатывая лог, я хочу получить на выходе файл, где не должно быть адресов, кроме тех, что есть в pull.
Непроблемные места я убрал, чтобы не нагружать лишним:
pull = "" log = "путь_к_логу" output = "путь_к_обработанному_файлу" with open(log) as inp, open(output, "w") as out: spis = inp.readlines() for s in spis: if not re.search('[{}]'.format(pull), s): spis.remove(s)
Офлайн
0
Если вдруг я непонятно объяснил, то вот пример на простом списке:
import re l = ["123", "1aa", "@a1", "ЙЙЙ", "q2й", "$$$", "bbй"] pull = "a2b" for i in l: if not re.search('[{}]'.format(pull), i): l.remove(i) print(l) '123', '1aa', '@a1', 'q2й', 'bbй'
Офлайн
568
N.
Ваша ошибка распространена необычайно, нельзя перебирать список и одновременно удалять из него элементы.
Смотрите
l = [1, 2, 3, 4, 5] for i in l: l.remove(i) print(l)
Офлайн
0
FishHookВ том то и дело, что работаю с большими лог файлами и потому пытаюсь уйти от предыдущего способа с пересобираением нового списка в цикле. Способ достаточно медленный и приходится всегда расчитывать свободное место под еще один лог, из которого будет происходить удаление. Получается, в моем случае не выйдет решить проблему регулярными выражениями?
N.Ваша ошибка распространена необычайно, нельзя перебирать список и одновременно удалять из него элементы.Смотрите
Отредактировано N. (Фев. 19, 2018 12:24:54)
Офлайн
568
А вы отсортированные данные не в список пишите, а сразу в файл
Офлайн
0
FishHookЯ сейчас так и делаю. Есть исходный лог, я его сортирую и записываю в тот самый output из кода в 1 посте. Получается 2 лога: исходный и отсортированный. Я надеялся, что есть возможность сделать скрипт, который будет работать с регулярками как потоковый редактор sed в linux, который вносит изменения в тот же файл, без необходимости создавать новый.
А вы отсортированные данные не в список пишите, а сразу в файл
Отредактировано N. (Фев. 19, 2018 12:34:37)
Офлайн
0
Ну и вопрос с самой регуляркой еще остается для меня открытым. Если даже придется оставить вариант с двумя файлами, как правильно организовать проверку по регулярке, как описано в посте 2?
Офлайн
568
N.А на чем зиждется ваша уверенность, что это тот же самый файл? Если я создам временный файл, потом удалю старый, а временный переименую будет как будто старый файл.
вносит изменения в тот же файл, без необходимости создавать новый
Офлайн
186
> К регулярным выражениям пришел, т.к. подсказали, что так код будет быстрее выполняться.
Обманули тебя. Регулярки намного медленнее методов строк.
Отредактировано Rodegast (Фев. 19, 2018 13:38:20)
Офлайн
0
RodegastЖаль… Тогда остановлюсь на старом варианте. Но на будущее все же поинтересуюсь, как применить регулярку для поиска элементов, полностю состоящих из заданных? Я еще раз перечитал учебник и документацию и не нашел методов, которые бы такое делали. Search ищет любой совпадение, findall только в заданном порядке и только полное совпадение с исходником. Грубо говоря, имея список из: “1”, “2”, “12”, “21”, “31”, “32”, “3” и паттерн “12”, как получить все элементы, которые состоят только из “1” и “2” вне зависимости от порядка и кол-ва повторений с помощью регуляки? Я понимаю как это сделать через обычный цикл вроде
Обманули тебя. Регулярки намного медленнее методов строк.
list1 = [...] pattern = "" def check(list1): for words in list1: for chars in words: if chars not in pattern: return False return True
Отредактировано N. (Фев. 19, 2018 13:51:45)
Офлайн