GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

daviddrysdale

python-phonenumbers – GoogleのlibphonenumberのPythonポート

投稿日:

GoogleのlibphonenumberのPythonポート

phonenumbers Pythonライブラリ

これはGoogleのlibphonenumberライブラリの Pythonポートです。Python 2.5-2.7とPython 3.xをサポートしています(同じコードベースで、 2to3変換は必要ありません)。

元のJavaコードはCopyright(C)2009-2015 The Libphonenumber Authorsです。

上流リリースノートから派生したリリース履歴。

使用例

図書館が扱う主要なオブジェクトはPhoneNumberオブジェクトです。 parse関数を使用して電話番号を表す文字列からこれを作成できますが、番号がダイヤルインされている国を指定する必要もあります(E.164形式でない場合は、グローバルに一意です)。

>>> import phonenumbers
>>> 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 == y
True
>>> 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 USA
False
>>> 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 used
False

parse関数は、一意に解析できない入力、または電話番号ではない可能性がある入力に対しても完全に失敗します( NumberParseException )。

>>> z = phonenumbers.parse("02081234567", None)  # no region, no + => unparseable
Traceback (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下にありPhoneNumberFormat )、 format_number関数がフォーマットを行います。

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

アプリケーションでユーザーが電話番号を入力できるUIがある場合は、ユーザーの入力時に適用される書式を取得することをお勧めします。 AsYouTypeFormatterオブジェクトはこれを許可します。

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

場合によっては、内部に電話番号がある場合とない場合がある大きなテキストブロックがあります。 このために、 PhoneNumberMatcherオブジェクトは関連する機能を提供します。 それを反復してPhoneNumberMatchオブジェクトのシーケンスを取得することがPhoneNumberMatchます。 これらの一致オブジェクトのそれぞれは、 PhoneNumberオブジェクトと、元の文字列で一致した場所に関する情報を保持します。

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

電話番号に対応する場所に関する情報を取得したい場合があります。 geocoder.area_description_for_numberは可能な場合はこれを行います。

>>> from phonenumbers import geocoder
>>> ch_number = phonenumbers.parse("0431234567", "CH")
>>> print repr(geocoder.description_for_number(ch_number, "de"))
u'Z\\xfcrich'
>>> print repr(geocoder.description_for_number(ch_number, "en"))
u'Zurich'
>>> print repr(geocoder.description_for_number(ch_number, "fr"))
u'Zurich'
>>> print repr(geocoder.description_for_number(ch_number, "it"))
u'Zurigo'

一部の国の携帯電話番号については、どの携帯通信会社が最初に電話番号を所有していたかについての情報も確認できます。

>>> from phonenumbers import carrier
>>> ro_number = phonenumbers.parse("+40721234567", "RO")
>>> print repr(carrier.name_for_number(ro_number, "en"))
u'Vodafone'

また、その番号が潜在的に属するタイムゾーン名のリストを取得することもできます。

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

ライブラリから利用可能なその他の機能の詳細については、ユニットテストまたはオリジナルのlibphonenumberプロジェクトを参照してください

メモリ使用量

ライブラリには多くのメタデータが含まれているため、メモリオーバーヘッドが大きくなります。 このメタデータはオンデマンドでロードされるため、ライブラリ機能のサブセットのみを使用するアプリケーションのメモリフットプリントに悪影響はありません。

特に:

  • ジオコーディング・メタデータ(100メガバイトを超える)は、ジオコーディング関数の1つ( geocoder.description_for_numbergeocoder.description_for_valid_numberまたはgeocoder.country_name_for_number )の最初の使用時にのみロードされます。
  • キャリアメタデータは、マッピング関数の1つ( carrier.name_for_numberまたはcarrier.name_for_valid_number )の最初の使用時にのみロードされます。
  • タイムゾーンメタデータは、タイムゾーン関数の1つ( time_zones_for_numberまたはtime_zones_for_geographical_number )の最初の使用時にのみロードされます。
  • 各領域の通常のメタデータは、その領域のメタデータが必要なときに初めてロードされます。

メタデータのメモリ使用量が開始時に確実に考慮されるようにする必要がある場合(メタデータのオンデマンドロードでは一時停止やメモリが枯渇することはありません)

  • import phonenumbers.geocoderを呼び出してジオコーディングメタデータを強制的にロードしimport phonenumbers.geocoder
  • import phonenumbers.carrierを呼び出して、キャリアのメタデータを強制的にimport phonenumbers.carrier
  • import phonenumbers.timezoneを呼び出して、タイムゾーンのメタデータを強制的にimport phonenumbers.timezone
  • phonenumbers.PhoneMetadata.load_all()呼び出して、通常のメタデータを強制的にロードします。

パッケージのphonenumbersliteバージョンには、ジオコーディング、キャリアおよびタイムゾーンのメタデータは含まれていません。これは、スペース/メモリの制限のために主要なphonenumbersパッケージをインストールする際に問題がある場合に便利です。

プロジェクトのレイアウト

  • python/ディレクトリにはPythonコードが格納されています。
  • resources/ディレクトリは、 libphonenumberの resources/ディレクトリのコピーです。 これはPythonコードを実行する必要はありませんが、マスターメタデータのアップストリーム変更を組み込む必要がある場合に必要です。
  • tools/ディレクトリには、マスタメタデータのアップストリーム変更を処理するためのツールが格納されています。







-daviddrysdale

執筆者: