【问题标题】:What is the best way to find string in txt file by using python?使用python在txt文件中查找字符串的最佳方法是什么?
【发布时间】:2020-01-13 08:11:40
【问题描述】:

使用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

但是,正确使用网络服务太慢了(实际上是我的网络服务的后端逻辑) 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 来完成这项工作吗? 当我将整个文件保存在内存中时,我认为不再需要循环。

【问题讨论】:

  • 您的重构效率较低,因为现在您每次都将整个文件读入内存,即使在第一行找到该字符串也是如此。如果读取整个输入文件的成本可以分摊到多次使用中,那么用内存换取速度是有意义的,但如果在一次查询后将其全部扔掉,那不会有任何改善。

标签: python while-loop ipv4


【解决方案1】:

如果您必须使用文本文件,您可以尝试将整个文件读入内存而不是逐行搜索以加快速度。 (如果您将所有文件读入内存,则不再需要循环)

您可以尝试使用 grep 或 find,而不是编写 python 脚本来进行搜索。

您应该考虑将数据放入数据库并查询它以查找匹配项。这种方法应该更节省资源并且应该更快,因为数据库可以使用索引,并且它们不一定必须将整个数据集读入内存来查找匹配项。 如果您的应用程序足够简单,您也许可以使用 sqlite。

【讨论】:

  • 谢谢,我编辑了我的问题,您能再检查一次吗?
【解决方案2】:

如果您的任务是“我有一个静态文本文件,并且有动态查询询问该文本文件是否包含特定 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 循环中的伪代码可能会替换为 Flask 路由或其他东西,如果您的客户端是 Web 浏览器或 Web API 的使用者;但这种通用模式几乎适用于任何类型的服务器。

没有任何明显的方法可以更有效地将文本读入内存 - 如果您设法实现 100% CPU,这对您有好处,因为通常这类任务是 I/O 限制的,而不是 CPU 限制的。

如果文本文件不是静态的,也许您可​​以定期将其重新读入内存,或者在更新时将其导入数据库并让客户端查询。

【讨论】:

  • 谢谢,但 break 是需要的,我认为 queryIp 应该不在 while 循环中。你怎么想? with open('/home/socfw/src/edl/outbound_monthly.txt') as outMonIPs: ip = set(line.strip() for line in outMonIPs) inputIP = '127.0.0.1' while True: if inputIP in ip: print("ok") break else: print("no")
  • 谢谢,我编辑了我的问题,您能再检查一次吗?
【解决方案3】:

您可以尝试以这种方式使用for 循环:

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

【讨论】:

  • 这有点惯用,但对提高效率没有任何作用。
  • 谢谢,我编辑了我的问题,您能再检查一次吗?
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 2016-04-30
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多