是否可以使用python-phonenumbers或其他Python库从两个字母的国家代码(ISO 3166-1 alpha-2)获取国家呼叫代码?
在phonenumbers
库中的示例侧重于从号码中提取国家代码,但我想要做相反的事情,类似于:
"US" -> "1"
"GB" -> "44"
"CL" -> "56"
是否可以使用python-phonenumbers或其他Python库从两个字母的国家代码(ISO 3166-1 alpha-2)获取国家呼叫代码?
在phonenumbers
库中的示例侧重于从号码中提取国家代码,但我想要做相反的事情,类似于:
"US" -> "1"
"GB" -> "44"
"CL" -> "56"
我不知道是否有任何适用于此的Python库,但是这里提供了一个包含所有ISO 3166-1 alpha-2代码及其数字前缀的CSV文件,从那里查找应该很容易:
import csv
country_to_prefix = {}
with open("countrylist.csv") as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
country_to_prefix[row["ISO 3166-1 2 Letter Code"]] = row["ITU-T Telephone Code"]
print country_to_prefix["US"] # +1
print country_to_prefix["GB"] # +44
print country_to_prefix["CL"] # +56
编辑: 上述链接无法访问,但我在Github上找到了一个包含这些数据(以及更多内容)的存储库。使用该库。
In [1]: from phonenumbers import COUNTRY_CODE_TO_REGION_CODE
In [2]: COUNTRY_CODE_TO_REGION_CODE
Out[2]:
{1: ('US',
'AG',
'AI',
....
7: ('RU', 'KZ'),
20: ('EG',),
27: ('ZA',),
30: ('GR',),
31: ('NL',),
32: ('BE',),
33: ('FR',),
34: ('ES',),
36: ('HU',),
39: ('IT', 'VA'),
40: ('RO',),
... snip.
from phonenumbers import COUNTRY_CODE_TO_REGION_CODE, REGION_CODE_FOR_NON_GEO_ENTITY
REGION_CODE_TO_COUNTRY_CODE = {}
for country_code, region_codes in COUNTRY_CODE_TO_REGION_CODE.items():
for region_code in region_codes:
if region_code == REGION_CODE_FOR_NON_GEO_ENTITY:
continue
if region_code in REGION_CODE_TO_COUNTRY_CODE:
raise ValueError("%r is already in the country code list" % region_code)
REGION_CODE_TO_COUNTRY_CODE[region_code] = str(country_code)
def get_calling_code(iso):
for code, isos in COUNTRY_CODE_TO_REGION_CODE.items():
if iso.upper() in isos:
return code
return None
这将为你提供:
get_calling_code('US')
>> 1
get_calling_code('GB')
>> 44
phonenumbers
库实际上有一个 country_code_for_region()
函数(至少在版本8.10.5中):
>>> import phonenumbers
>>> phonenumbers.country_code_for_region("GB")
44
使用python-phonenumbers,您可以利用COUNTRY_CODE_TO_REGION_CODE映射,它是一个字典,将国际呼叫代码(int)作为键和国家代码(str)作为值。只需反转字典即可完成工作。
这里有一个示例(与toast38coza和cgte的答案非常相似):
REGION_CODE_TO_COUNTRY_CODE = {}
for k, vs in phonenumbers.COUNTRY_CODE_TO_REGION_CODE.items(): # prefix -> country code: 39 -> 'IT'
for v in vs: #because a prefix could belong to more countries
REGION_CODE_TO_COUNTRY_CODE[v] = k # country code-> prefix : 'IT' -> 39# now you have your reversed map
print( 'Italy country prefix: +'+ str( REGION_CODE_TO_COUNTRY_CODE['IT'] ) )