0

我正在尝试从 Web 表单中输入英国手机号码,并使用 Python 将其清理为 E.164 格式,然后对其进行验证,然后再将其输入数据库。

我正在尝试使用的库是“Phonenumbers”,到目前为止我正在试验的代码是:

def Phone():
    my_number = '+4407808765066'
    clean_phone = phonenumbers.parse(my_number, "GB")
    cleaner_phone = phonenumbers.format_number(clean_phone, 
    phonenumbers.PhoneNumberFormat.E164)
    valid = phonenumbers.is_possible_number(cleaner_phone)
    print(cleaner_phone)

只是通过逻辑,我的期望是它应该获取变量的内容,将其my_number格式化为clean_phone变量,然后将其格式化为 E.164 标准,然后再将其传递给验证并将输出返回到valid. 打印语句是让我看到输出。

如果我注释掉valid变量行,一切看起来都正常。一旦我取消注释,我就会收到一个错误(见下文)。

Traceback (most recent call last):
  File "phone_test.py", line 14, in <module>
    Phone()
  File "phone_test.py", line 10, in Phone
    valid = phonenumbers.is_possible_number(cleaner_phone)
  File "D:\Dropbox\Coding Projects\learner_driver_app\env\lib\site-packages\phonenumbers\phonenumberutil.py", line 2257, in is_possible_number      
    result = is_possible_number_with_reason(numobj)
  File "D:\Dropbox\Coding Projects\learner_driver_app\env\lib\site-packages\phonenumbers\phonenumberutil.py", line 2358, in is_possible_number_with_reason
    return is_possible_number_for_type_with_reason(numobj, PhoneNumberType.UNKNOWN)
  File "D:\Dropbox\Coding Projects\learner_driver_app\env\lib\site-packages\phonenumbers\phonenumberutil.py", line 2393, in is_possible_number_for_type_with_reason
    national_number = national_significant_number(numobj)
  File "D:\Dropbox\Coding Projects\learner_driver_app\env\lib\site-packages\phonenumbers\phonenumberutil.py", line 1628, in national_significant_number
    if numobj.italian_leading_zero:
AttributeError: 'str' object has no attribute 'italian_leading_zero'

我哪里错了?

4

2 回答 2

3

my_number是类型str(字符串)的变量,因此是错误的最后一行)。字符串类不知道该属性national_number
阅读他们在 GitHub 上的示例,我怀疑您需要先将字符串传递给parse()函数,然后才能使用库中的函数。

def Phone():
    my_number = '+4407811111111'
    number_prased = phonenumbers.parse(my_number, None)  # this is new
    clean_phone = phonenumbers.format_number(number_parsed, 
    phonenumbers.PhoneNumberFormat.E164)
    return clean_phone

如果知道的话, Noneinparse()可以用国家代码代替。否则,它会尝试弄清楚但可能会失败。

编辑以考虑原始问题中的更多信息:
显然phonenumbers.format_number()返回一个字符串,因此您必须再次重新解析数字以获取类型的对象phonenumbers.phonenumber.PhoneNumber(您可以检查对象的类型type(my_object))。之后,您的代码将返回True.

于 2021-11-11T16:00:19.620 回答
0

您不能使用format_number带有字符串作为参数的函数,它需要一个PhoneNumber对象。

您可以使用该parse功能获得一个。

请参阅https://github.com/daviddrysdale/python-phonenumbers/tree/dev/python#example-usage

于 2021-11-11T16:00:44.903 回答