从 python 中的国家代码获取 phone 号码的国际前缀

get a phone number's international prefix from a country code in python

是否可以使用 python-phonenumbers or another python lib to get a country calling code from a two letter country code (ISO 3166-1 alpha-2)?

phonenumbers 库中的示例侧重于从数字中提取国家代码,但我想做相反的事情,例如:

"US" -> "1" "GB" -> "44" "CL" -> "56"

我不知道有任何 python 库,但是 here 是一个包含所有 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

编辑:上面的link已经下架了,但是我在Github上找到了一个repository with that data (and more)

使用库。

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)

以下函数将从提供的 iso 代码中为您提供调用代码:

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

使用python-phonenumbers你可以利用COUNTRY_CODE_TO_REGION_CODE映射,它是一个以国际电话代码(int)作为键和国家代码(str ) 作为值。你只需反转字典,工作就完成了。
举个例子(和toast38coza and 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'] ) )

希望对您有所帮助

phonenumbers 库实际上有(至少从版本 8.10.5 开始)一个 country_code_for_region() 函数:

>>> import phonenumbers
>>> phonenumbers.country_code_for_region("GB")
44