我正试图从web表单中输入一个英国手机号码,并使用Python将其清理为E.164格式,然后在将其输入数据库之前对其进行验证。
我想使用的图书馆是";电话号码";到目前为止,我正在试验的代码是:
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:DropboxCoding Projectslearner_driver_appenvlibsite-packagesphonenumbersphonenumberutil.py", line 2257, in is_possible_number
result = is_possible_number_with_reason(numobj)
File "D:DropboxCoding Projectslearner_driver_appenvlibsite-packagesphonenumbersphonenumberutil.py", line 2358, in is_possible_number_with_reason
return is_possible_number_for_type_with_reason(numobj, PhoneNumberType.UNKNOWN)
File "D:DropboxCoding Projectslearner_driver_appenvlibsite-packagesphonenumbersphonenumberutil.py", line 2393, in is_possible_number_for_type_with_reason
national_number = national_significant_number(numobj)
File "D:DropboxCoding Projectslearner_driver_appenvlibsite-packagesphonenumbersphonenumberutil.py", line 1628, in national_significant_number
if numobj.italian_leading_zero:
AttributeError: 'str' object has no attribute 'italian_leading_zero'
我哪里错了?
您的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
如果CCD_ 10中的CCD_ 9是已知的,则可以用国家代码代替。否则,它会试图弄清楚,但可能会失败。
编辑以解释原始问题中的更多信息:
显然phonenumbers.format_number()
返回了一个字符串,因此您必须再次重新解析该数字才能获得类型为phonenumbers.phonenumber.PhoneNumber
的对象(您可以使用type(my_object)
检查对象的类型(。之后,您的代码将返回True
。
不能将format_number
函数与字符串一起用作参数,它需要一个PhoneNumber
对象。
您可以使用parse
函数获得一个。
请参阅https://github.com/daviddrysdale/python-phonenumbers/tree/dev/python#example-使用