Каков наилучший способ найти строку в текстовом файле с помощью python? - PullRequest
0 голосов
/ 13 января 2020

Должны быть разные способы найти строку в текстовом файле с помощью python, но как лучше? (для скорости, для ресурсов ..)

Моя первая идея была такой, как показано ниже.

file = open('/home/socfw/src/edl/outbound_monthly.txt')

inputIP = '127.0.0.1'

while (1):
    line = file.readline()
    if inputIP in line:
        print("ok")
        break

Но, это слишком медленно для правильного использования веб-службы (на самом деле это backend logi c моего веб-сервиса) TXT-файл выглядит так, как показано ниже

test.txt (адреса IPV4 находятся здесь, и их число составляет почти 60 КБ)

x.x.x.x
x.x.x.x
.
.
.
.

Мой исходный код вызывает 100-процентную загрузку ЦП для несколько минут, поэтому я хочу найти другой путь. Есть ли хорошее решение для меня? заранее спасибо.


Спасибо, что ответили мне. Я изменил свои источники, как показано ниже.

with open('/home/socfw/src/edl/outbound_monthly.txt') as outMonIPs:
    ip = set(line.strip() for line in outMonIPs)

inputIP = '111.90.150.249'
#while True:
if inputIP in ip:
    print("ok")
#        break
else:
    print("no")
#        break

У меня есть еще один вопрос, должен ли я использовать loop для этой работы? Я думаю, что l oop больше не требуется, когда я сохраняю весь файл в памяти.

Ответы [ 3 ]

2 голосов
/ 13 января 2020

Если вам нужно использовать текстовые файлы, вы можете попробовать прочитать весь файл в памяти вместо того, чтобы искать его построчно, чтобы ускорить процесс. (Если вы прочитали весь файл в память, вам больше не нужен l oop)

Вместо написания python скрипта для поиска, вы можете попробовать использовать grep или find .

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

1 голос
/ 13 января 2020

Если ваша задача «У меня есть текстовый файл stati c, и есть динамические c запросы, спрашивающие, содержит ли этот текстовый файл определенный IP-адрес», то просто прочитайте файл в память один раз, а затем обработайте запросы по мере их поступления.

with open('/home/socfw/src/edl/outbound_monthly.txt') as ipaddresses:
    ip = set(line.strip() for line in ipaddresses)

while True:  # notice how a boolean is the idiomatic way to express an endless loop
    queryip = somehow receive a query from a client()
    if queryip in ip:
        tell client yes()
    else:
        tell client no()

Псевдокод в while l oop может быть заменен маршрутом Flask или чем-то другим, если ваши клиенты являются веб-браузерами или потребителями веб-API; но этот общий шаблон будет применяться практически ко всем типам серверов.

Нет никакого очевидного способа сделать чтение текста в память более эффективным - хорошо, если вам удастся достичь 100% CPU потому что обычно такого рода задачи связаны с вводом / выводом, а не с процессором.

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

1 голос
/ 13 января 2020

Вы можете попробовать использовать for l oop следующим образом:

for line in file:
    if inputIP in line:
        print(ok)
        break
...