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.