Найти - Пользователи
Полная версия: Медленный парсинг файла
Начало » Python для новичков » Медленный парсинг файла
1 2
bismigalis
оказалось компилить не обязательно(если не мильён итераций), оно все равно кешируется первый раз при вызове глобальной функции

может регулярка не оптимальная, ты хоть на выходе результат правильный получаешь?

PS: кстати точки экранировать надо
py.user.next
#!/usr/bin/env python3
 
import re
 
ifname = 'file.txt'
 
pat = r';(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3});'
 
lst = []
with open(ifname, encoding='utf-8') as fin:
    for line in fin:
        match = re.search(pat, line)
        match and lst.append(match.group(1))
 
print(lst[:10])
print(len(lst))

[guest@localhost txtip]$ head -5 file.txt
12345;127.0.0.1;6789
12345;192.168.0.1;6789
12345;192.168.0.2;6789
12345;192.168.0.3;6789
12345;127.0.0.1;6789
[guest@localhost txtip]$ wc file.txt
9600 9600 216000 file.txt
[guest@localhost txtip]$ ./txtip.py
['127.0.0.1', '192.168.0.1', '192.168.0.2', '192.168.0.3', '127.0.0.1', '192.168.0.1', '192.168.0.2', '192.168.0.3', '127.0.0.1', '192.168.0.1']
9600
[guest@localhost txtip]$

за секунду примерно

хотя эта быстрее в двенадцать раз
#!/usr/bin/env python3
 
import re
 
ifname = 'file.txt'
 
pat = r';(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3});'
 
with open(ifname, encoding='utf-8') as fin:
    lst = [i.group(1) for i in filter(None, map(re.compile(pat).search, fin))]
 
print(lst[:10])
print(len(lst))
Lexander
aborodin
Lexander, есть не нулевая вероятность что может появиться “лишний” разделитель в текстовом поле
Ну так и IPv6 может быть :)
aborodin
3. 832350 байт
Если это НЕ ежесекундно поступающие данные из внешнего источника, то - все в память и не мучиться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB