尝试从表单输入中对电话号码进行 e.164 处理

and*_*s73 1 python python-phonenumber

我正在尝试从 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)
Run Code Online (Sandbox Code Playgroud)

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

如果我注释掉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'

Run Code Online (Sandbox Code Playgroud)

我哪里出错了?

小智 5

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

def phone_parser():
    my_number = '+4407811111111'
    number_parsed = phonenumbers.parse(my_number, None)  # this is new
    clean_phone = phonenumbers.format_number(number_parsed, 
    phonenumbers.PhoneNumberFormat.E164)
    return clean_phone
Run Code Online (Sandbox Code Playgroud)

如果已知,则可以用国家/地区代码替换Nonein 。parse()否则,它会尝试找出答案,但可能会失败。

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