gpt4 book ai didi

python - 如何正确传递文本文件来搜索那里的数据?

转载 作者:太空宇宙 更新时间:2023-11-04 06:08:28 26 4
gpt4 key购买 nike

我有包含电话号码范围列表及其所有者(移动运营商的名称)的文件 - http://www.rossvyaz.ru/opendata/7710549038-Rosnumbase/Kody_DEF-9kh.csv:

900;1940000;1949999;10000;Sky-1800
916;0;9999999;10000000;Mobile TeleSystems
917;0;29999;30000;Mobile TeleSystems

我每周都会有新的电话号码(格式如 +79161234567)。所以,我应该检测他们的运营商。因此,我计划每周下载更新的列表,然后将我拥有的手机与该列表进行匹配。主要问题是如何有效地做到这一点。下载文件后,将其保存在内存中然后搜索移动运营商的最佳方法是什么?

第一个想法是逐行读取文件,解析它,比较DEF(if '916' == def_from_the_line),如果是,然后比较范围(if 1234567>=range_start_from_the_line and 1234566<=range_end_from_the_line),但它不会很有效(考虑到我会有查找多个电话号码)。

最佳答案

这是您可以使用的数据结构:

from collections import defaultdict

operators = defaultdict(list)
for line in open('data').readlines():
pre, begin, end, _, operator_name = line.split(None,4)
operators[pre].append((int(begin),int(end),operator_name))

现在 operators 是一个字典,其键是前缀 (900, 916, 917),其值是三元组列表:范围开始、范围结束和运算符名称。现在您可以将该数据保存到磁盘以避免一次又一次地解析文件。

import pickle
pickle.dump(operators, open("operators", "wb"))

当你得到一个新的数字时,只需重新加载operators对象并将它留在内存中。

operators = pickle.load(open("operators", "r"))

然后,以下函数将解析新数字并找到它适合的范围:

def get_operator(number, operators):
pre = number[2:5]
suf = int(number[5:])
for begin, end, name in operators[pre]:
if begin <= suf <= end:
return name.strip()
return Null


print get_operator("+79161234567", operators)

上面打印Mobile TeleSystems

关于python - 如何正确传递文本文件来搜索那里的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20444797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com