python版本的google通用库,用于解析、格式化、存储和验证国际电话号码。

phonenumbers的Python项目详细描述


电话号码python库

Coverage Status

这是Google's libphonenumber library的python端口 它支持Python2.5-2.7和Python3.x(在相同的代码库中,没有 2to3需要转换)。

原始Java代码版权所有(c)2009-2015 libphoneNumber作者。

释放HISTORY,派生自upstream release notes

安装

使用pip和:

安装
pip install phonenumbers

示例用法

库处理的主要对象是PhoneNumber对象。可以从字符串创建 使用parse函数表示电话号码,但还需要指定国家/地区 正在从中拨出电话号码(除非该号码是E.164格式,这是全局性的 独一无二)。

>>> importphonenumbers>>> x=phonenumbers.parse("+442083661177",None)>>> print(x)Country Code: 44 National Number: 2083661177 Leading Zero: False>>> type(x)<class 'phonenumbers.phonenumber.PhoneNumber'>>>> y=phonenumbers.parse("020 8366 1177","GB")>>> print(y)Country Code: 44 National Number: 2083661177 Leading Zero: False>>> x==yTrue>>> z=phonenumbers.parse("00 1 650 253 2222","GB")# as dialled from GB, not a GB number>>> print(z)Country Code: 1 National Number: 6502532222 Leading Zero(s): False

parse生成的PhoneNumber对象通常仍需要验证,以检查 它是一个可能的数字(例如,它有正确的位数)或一个有效的数字(例如 在指定的交换中)。

>>> z=phonenumbers.parse("+120012301",None)>>> print(z)Country Code: 1 National Number: 20012301 Leading Zero: False>>> phonenumbers.is_possible_number(z)# too few digits for USAFalse>>> phonenumbers.is_valid_number(z)False>>> z=phonenumbers.parse("+12001230101",None)>>> print(z)Country Code: 1 National Number: 2001230101 Leading Zero: False>>> phonenumbers.is_possible_number(z)True>>> phonenumbers.is_valid_number(z)# NPA 200 not usedFalse

对于不能 唯一解析,或者不可能是电话号码。

>>> z=phonenumbers.parse("02081234567",None)# no region, no + => unparseableTraceback (most recent call last):
  File "phonenumbers/phonenumberutil.py", line 2350, in parse"Missing or invalid default region.")phonenumbers.phonenumberutil.NumberParseException: (0) Missing or invalid default region.>>> z=phonenumbers.parse("gibberish",None)Traceback (most recent call last):
  File "phonenumbers/phonenumberutil.py", line 2344, in parse"The string supplied did not seem to be a phone number.")phonenumbers.phonenumberutil.NumberParseException: (1) The string supplied did not seem to be a phone number.

一旦你有了一个电话号码,一个常见的任务就是用标准格式格式化它。有几个 可用格式(在PhoneNumberFormat下),由format_number函数进行格式化。

>>> phonenumbers.format_number(x,phonenumbers.PhoneNumberFormat.NATIONAL)'020 8366 1177'>>> phonenumbers.format_number(x,phonenumbers.PhoneNumberFormat.INTERNATIONAL)'+44 20 8366 1177'>>> phonenumbers.format_number(x,phonenumbers.PhoneNumberFormat.E164)'+442083661177'

如果您的应用程序有一个允许用户键入电话号码的ui,那么很高兴获得格式 作为用户类型应用。AsYouTypeFormatter对象允许这样做。

>>> formatter=phonenumbers.AsYouTypeFormatter("US")>>> formatter.input_digit("6")'6'>>> formatter.input_digit("5")'65'>>> formatter.input_digit("0")'650'>>> formatter.input_digit("2")'650 2'>>> formatter.input_digit("5")'650 25'>>> formatter.input_digit("3")'650 253'>>> formatter.input_digit("2")'650-2532'>>> formatter.input_digit("2")'(650) 253-22'>>> formatter.input_digit("2")'(650) 253-222'>>> formatter.input_digit("2")'(650) 253-2222'

有时,你有一个更大的文本块,其中可能有或没有一些电话号码。为了这个, PhoneNumberMatcher对象提供了相关的功能;您可以遍历它来检索 对象的序列。这些匹配对象中的每一个都包含一个PhoneNumber对象 与原始字符串中匹配的位置有关的信息。

>>> text="Call me at 510-748-8230 if it's before 9:30, or on 703-4800500 after 10am.">>> formatchinphonenumbers.PhoneNumberMatcher(text,"US"):... print(match)...PhoneNumberMatch [11,23) 510-748-8230PhoneNumberMatch [51,62) 703-4800500>>> formatchinphonenumbers.PhoneNumberMatcher(text,"US"):... print(phonenumbers.format_number(match.number,phonenumbers.PhoneNumberFormat.E164))...+15107488230+17034800500

您可能需要获得与电话号码相对应的位置的一些信息。这个 geocoder.area_description_for_number尽可能做到这一点。

>>> fromphonenumbersimportgeocoder>>> ch_number=phonenumbers.parse("0431234567","CH")>>> geocoder.description_for_number(ch_number,"de")'Zürich'>>> geocoder.description_for_number(ch_number,"en")'Zurich'>>> geocoder.description_for_number(ch_number,"fr")'Zurich'>>> geocoder.description_for_number(ch_number,"it")'Zurigo'

对于某些国家的移动电话号码,您还可以了解有关哪个运营商的信息 最初拥有一个电话号码。

>>> fromphonenumbersimportcarrier>>> ro_number=phonenumbers.parse("+40721234567","RO")>>> carrier.name_for_number(ro_number,"en")'Vodafone'

您还可以检索一个时区名称列表,该编号可能 属于。

>>> fromphonenumbersimporttimezone>>> gb_number=phonenumbers.parse("+447986123456","GB")>>> timezone.time_zones_for_number(gb_number)('Atlantic/Reykjavik', 'Europe/London')

有关库中可用的其他功能的更多信息,请查看单元测试或原始的 libphonenumber project

内存使用量

这个库包含了大量元数据,这给了很大的内存开销。此元数据按需加载,以便 仅使用库功能子集的应用程序的内存占用不会受到不利影响。

特别是:

  • 地理编码元数据(超过100兆字节)仅在首次使用 地理编码函数之一(geocoder.description_for_numbergeocoder.description_for_valid_number 或者geocoder.country_name_for_number)。
  • 载体元数据只在第一次使用映射函数时加载(carrier.name_for_number) 或者carrier.name_for_valid_number)。
  • 时区元数据只在第一次使用某个时区函数时加载(time_zones_for_number) 或者time_zones_for_geographical_number)。
  • 每个区域的常规元数据仅在第一次需要该区域的元数据时加载。

如果您需要确保元数据内存的使用在一天的开始就被考虑到(即,随后的按需 加载元数据不会导致暂停或内存耗尽:

  • 通过调用import phonenumbers.geocoder强制加载地理编码元数据。
  • 通过调用import phonenumbers.carrier强制加载载体元数据。
  • 通过调用import phonenumbers.timezone强制加载时区元数据。
  • 通过调用phonenumbers.PhoneMetadata.load_all()强制加载普通元数据。

包的phonenumberslite版本不包括地理编码、载体和时区元数据, 如果您在安装主phonenumbers包时遇到问题空间/内存限制。

项目布局

  • python/目录保存python代码。
  • resources/目录是resources/的副本。 目录来自 libphonenumber。 这不需要运行python代码,但在上游时需要 需要合并对主元数据的更改。
  • tools/目录保存用于处理上游的工具 对主元数据的更改。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Maven无法识别安装在Ubuntu外壳上的$java_HOME jdk   java如何防止可运行程序在其中一个抛出异常时执行   java Listview在按下项时不触发   如何在WindowsPhone8中使用JavaRESTWebService?   java在spring引导下使用多个dispatcher servlet/web上下文   java为什么在删除容器的绝对大小时不绘制GEF子项?   java在hibernate实体中保留DB约束是好的   JavaSpring选择最高优先级bean   ArrayList<Class>java字符串[]   有向加权边图的Java邻接表实现   字母数字字符串的java Tesseract配置:混合2、Z、6和G   如果输入为空,则带有EditText的java警报对话框将关闭   jsp上的java Struts 2动作响应   java获取IndexOutOfBundException Android   scala AWSJAVASDK:解压缩大小必须小于262144000字节