簡體   English   中英

使用python在txt文件中查找字符串的最佳方法是什么?

[英]What is the best way to find string in txt file by using python?

必須有多種方法可以使用 python 在 txt 文件中查找字符串,但最好的方法是什么? (為了速度,為了資源......)

我的第一個想法如下。

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

但是,正確使用 web 服務太慢了(它實際上是我的 web 服務的后端邏輯)txt 文件如下所示

test.txt(這里有IPV4地址,將近60k)

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

我的源代碼導致 100% CPU 持續幾分鍾,所以我想找到另一種方法。 有什么好的解決辦法嗎? 提前致謝。


謝謝你回答我。 我改變了我的來源如下。

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嗎? 當我將整個文件保存在內存中時,我認為不再需要循環。

如果您必須使用文本文件,您可以嘗試將整個文件讀入內存而不是逐行搜索以加快速度。 (如果您將所有文件讀入內存,則不再需要循環)

您可以嘗試使用 grep 或 find,而不是編寫 Python 腳本來進行搜索。

您應該考慮將數據放入數據庫並查詢以查找匹配項。 這種方法應該更有效地利用資源並且應該更快,因為數據庫可以使用索引,並且它們不必將整個數據集讀入內存來查找匹配項。 如果您的應用程序足夠簡單,您或許可以使用 sqlite。

您可以嘗試以這種方式使用for循環:

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

如果您的任務是“我有一個靜態文本文件,並且有動態查詢詢問該文本文件是否包含特定的 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()

如果您的客戶端是 Web 瀏覽器或 Web API 的使用者, while循環中的偽代碼可能會被 Flask 路由或其他東西替換; 但是這種通用模式幾乎適用於任何類型的服務器。

沒有任何明顯的方法可以使將文本讀取到內存中的效率更高 - 如果您設法實現 100% CPU,這對您有好處,因為通常此類任務受 I/O 限制,而不是 CPU 限制。

如果文本文件不是靜態的,也許您可​​以定期將其重新讀取到內存中,或者在更新時將其導入到數據庫中,然后讓客戶端進行查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM