使用 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
来完成这项工作吗?
当我将整个文件保存在内存中时,我认为不再需要循环。
您可以尝试这样使用 for
循环:
for line in file:
if inputIP in line:
print(ok)
break
如果您必须使用文本文件,您可以尝试将整个文件读入内存,而不是逐行搜索以加快速度。 (如果你把所有的文件读入内存,你就不需要循环了)
您可以尝试使用 grep 或 find,而不是编写 python 脚本来进行搜索。
您应该考虑将数据放入数据库并查询它以找到匹配项。这种方法应该更有效地利用资源并且应该更快,因为数据库可以使用索引并且它们不一定必须将整个数据集读入内存才能找到匹配项。
如果您的应用程序足够简单,您也许可以使用 sqlite。
如果您的任务是 "I have a static text file and there are dynamic queries asking whether that text file contains a particular IP address" 那么只需将文件读入内存一次,然后在查询进入时处理它们。
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 路由或其他内容 API;但这种通用模式几乎适用于任何类型的服务器。
没有任何明显的方法可以更有效地将文本读入内存 - 如果您设法达到 100% CPU,这对您有好处,因为通常这种任务是 I/O 绑定,不是 CPU 绑定。
如果文本文件不是静态的,也许您可以定期将其重新读入内存,或者在更新时将其导入数据库并让客户端查询。
必须有多种方法可以使用 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
来完成这项工作吗?
当我将整个文件保存在内存中时,我认为不再需要循环。
您可以尝试这样使用 for
循环:
for line in file:
if inputIP in line:
print(ok)
break
如果您必须使用文本文件,您可以尝试将整个文件读入内存,而不是逐行搜索以加快速度。 (如果你把所有的文件读入内存,你就不需要循环了)
您可以尝试使用 grep 或 find,而不是编写 python 脚本来进行搜索。
您应该考虑将数据放入数据库并查询它以找到匹配项。这种方法应该更有效地利用资源并且应该更快,因为数据库可以使用索引并且它们不一定必须将整个数据集读入内存才能找到匹配项。 如果您的应用程序足够简单,您也许可以使用 sqlite。
如果您的任务是 "I have a static text file and there are dynamic queries asking whether that text file contains a particular IP address" 那么只需将文件读入内存一次,然后在查询进入时处理它们。
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 路由或其他内容 API;但这种通用模式几乎适用于任何类型的服务器。
没有任何明显的方法可以更有效地将文本读入内存 - 如果您设法达到 100% CPU,这对您有好处,因为通常这种任务是 I/O 绑定,不是 CPU 绑定。
如果文本文件不是静态的,也许您可以定期将其重新读入内存,或者在更新时将其导入数据库并让客户端查询。