从python中的国家/地区代码中获取电话号码的国际前缀

时间:2015-04-20 21:15:38

标签: python internationalization phone-number

是否可以使用python-phonenumbers或其他python lib从两个字母的国家/地区代码(ISO 3166-1 alpha-2)获取调用代码的国家/地区?

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

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

4 个答案:

答案 0 :(得分:5)

我不知道任何python lib,但here' sa csv包含所有ISO 3166-1 alpha-2代码及其编号前缀,看起来应该是微不足道的从那里开始:

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上找到了repository with that data (and more)

答案 1 :(得分:3)

使用lib。

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

答案 2 :(得分:0)

使用python-phonenumbers,您可以利用 COUNTRY_CODE_TO_REGION_CODE 映射,这是一个以国际呼叫代码(int)作为键和国家代码(str)作为值的字典。您只需撤销命令即可完成工作。
这里有一个例子(非常类似于toast38cozacgte的答案):

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'] ) )

希望这会有所帮助

答案 3 :(得分:0)

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

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