0

我想通过 Python 使用电话号码访问国家/地区名称。但是对于某些输入数据它不返回任何内容,我该如何解决这个问题?在 Phonenumbers 文档中,我发现了以下可疑评论:

如果已经发现该号码对一个地区有效,那么我们不知道它属于哪个地区,所以我们什么也不返回。

import phonenumbers
from phonenumbers import geocoder

phone = '+39391359045341'
p = phonenumbers.parse(phone)
geocoder.country_name_for_number(p, 'en')
4

2 回答 2

2

您的代码失败的原因+39是被多个国家(意大利和梵蒂冈)使用,正如您引用的评论所解释的那样,在这种情况下,该函数不会返回任何内容,因为该地区不明确。(虽然库中的一些函数似乎只使用了主要区域)。

因此,如果您想要主要区域(返回"Italy"),这是我的固定功能:

import phonenumbers.geocoder

def country_name_for_number(p: phonenumbers.PhoneNumber, lang="en") -> str:
    rc = phonenumbers.geocoder.region_code_for_country_code(p.country_code)
    return phonenumbers.geocoder._region_display_name(rc, lang)

或者,如果您想要所有区域(返回["Italy", "Vatican"]

def country_names_for_number(p: phonenumbers.PhoneNumber, lang="en") -> list[str]:
    rcs = phonenumbers.geocoder.region_codes_for_country_code(p.country_code)
    return [phonenumbers.geocoder._region_display_name(rc, lang) for rc in rcs]

原评论:

我能够重现country_name_for_number不返回任何东西的问题。我检查了源代码,它在内部调用region_code_for_country_code查找 2 个字母代码 ( +39...-> IT),然后使用LOCALE_DATA内部的字典_region_display_name来查找代码 ( IT-> Italy)。交互式:

import phonenumbers.geocoder

c = phonenumbers.parse("+39391359045341")
print(phonenumbers.geocoder.country_name_for_number(c, "en"))  # returns 'None'?!
print(phonenumbers.geocoder.region_code_for_country_code(c.country_code))  # 'IT'
print(phonenumbers.geocoder._region_display_name("IT", "en"))  # Italy
于 2022-02-18T12:10:34.040 回答
1

@xjcl 答案很有意义,我没有检查图书馆,我使用了不正确的方法。使用@xjcl 提供的函数

#check whether a phone number is valid or not
import phonenumbers
from phonenumbers import geocoder

people = ['John', 'Mary', 'Peter']
texts = ['+39391359045341', '+919876543210', '+559876543210']
# Parsing String to Phone number
numbers = [phonenumbers.parse(txt) for txt in texts]
valids = [phonenumbers.is_valid_number(number) for number in numbers]
countries = [country_names_for_number(number) for number in numbers]

result = []
for i in range(len(valids)):
    if valids[i]:
        result.append((people[i], texts[i], countries[i]))
print(result)

原评论:

显然 phonenumbers 库中存在一些错误,请参阅,当在某些号码上运行时,它会找到一个国家(Maranhão)而不是国家本身(巴西)。向图书馆建设者报告。

    #check whether a phone number is valid or not
    import phonenumbers
    people = ['John', 'Mary', 'Peter']
    texts = ['+39391359045341', '+919876543210', '+559876543210']
    # Parsing String to Phone number
    numbers = [phonenumbers.parse(txt) for txt in texts]
    valids = [phonenumbers.is_valid_number(number) for number in numbers]
    possibles = [phonenumbers.is_possible_number(number) for number in numbers]
    print(valids)
    print(possibles)

    #find carrier and region of a phone number
    from phonenumbers import geocoder, carrier
    carriers = [carrier.name_for_number(number, 'en') for number in numbers]
    regions = [geocoder.description_for_number(number, 'en') for number in numbers]

    result = []
    for i in range(len(valids)):
        if valids[i]:
            result.append((people[i], texts[i], carriers[i], regions[i]))
    print(result)
于 2022-02-18T12:29:20.903 回答