├── setup.cfg ├── tests ├── __init__.py └── test_address.py ├── MANIFEST.in ├── japanese_addresses ├── VERSION.py ├── prefecture2city2street.pkl └── __init__.py ├── .gitmodules ├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .editorconfig ├── .pre-commit-config.yaml ├── pyproject.toml ├── .github └── workflows │ ├── pythonpublish.yml │ ├── pythonpackage.yml │ └── update.yml ├── scripts └── csv_to_dict.py ├── LICENSE ├── .gitignore ├── README.md └── poetry.lock /setup.cfg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.md 2 | -------------------------------------------------------------------------------- /japanese_addresses/VERSION.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.0.3" 2 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "geolonia-japanese-addresses"] 2 | path = geolonia-japanese-addresses 3 | url = https://github.com/geolonia/japanese-addresses 4 | -------------------------------------------------------------------------------- /japanese_addresses/prefecture2city2street.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wakame1367/japanese-addresses/HEAD/japanese_addresses/prefecture2city2street.pkl -------------------------------------------------------------------------------- /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG VARIANT="3" 2 | FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT} 3 | 4 | RUN apt-get update \ 5 | && apt-get -y install vim 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | 9 | [*.py] 10 | indent_style = space 11 | indent_size = 4 12 | 13 | [*.yml] 14 | indent_style = space 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/psf/black 3 | rev: stable 4 | hooks: 5 | - id: black 6 | - repo: https://gitlab.com/pycqa/flake8 7 | rev: '' # pick a git hash / tag to point to 8 | hooks: 9 | - id: flake8 10 | - repo: https://github.com/pre-commit/mirrors-mypy 11 | rev: '' # Use the sha / tag you want to point at 12 | hooks: 13 | - id: mypy 14 | - repo: https://github.com/pycqa/pydocstyle 15 | rev: 4.0.0 # pick a git hash / tag to point to 16 | hooks: 17 | - id: pydocstyle 18 | exclude: test_.*\.py 19 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["poetry>=1.0.0",] 3 | build-backend = "poetry.masonry.api" 4 | 5 | [tool.poetry] 6 | version = "0.0.3" 7 | name = "japanese-addresses" 8 | authors = [ "wakame ",] 9 | description = "" 10 | readme = "README.md" 11 | license = "MIT" 12 | homepage = "" 13 | repository = "https://github.com/wakamezake/japanese-addresses.git" 14 | 15 | [tool.poetry.dependencies] 16 | python = "^3.6.1" 17 | dataclasses = {version = "^0.7", python = ">=3.6, <3.7"} 18 | kanjize = "^0.1.0" 19 | 20 | [tool.poetry.dev-dependencies] 21 | pytest = "^6.0.1" 22 | pandas = "^1.1.0" 23 | 24 | [tool.black] 25 | line-length = 79 26 | -------------------------------------------------------------------------------- /.github/workflows/pythonpublish.yml: -------------------------------------------------------------------------------- 1 | name: Upload Python Package 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | deploy: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - name: Set up Python 13 | uses: actions/setup-python@v1 14 | with: 15 | python-version: '3.x' 16 | - name: Install dependencies 17 | run: | 18 | python -m pip install --upgrade pip 19 | pip install setuptools wheel twine 20 | - name: Build and publish 21 | env: 22 | TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} 23 | TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} 24 | run: | 25 | python setup.py sdist bdist_wheel 26 | twine upload dist/* 27 | -------------------------------------------------------------------------------- /scripts/csv_to_dict.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import pickle 3 | URL_JAPANESE_ADDRESSES = 'https://raw.githubusercontent.com/geolonia/' \ 4 | 'japanese-addresses/master/data/latest.csv' 5 | 6 | 7 | def main(): 8 | prefecture_col = '都道府県名' 9 | city_col = '市区町村名' 10 | street_col = '大字町丁目名' 11 | japanese_addresses = pd.read_csv(URL_JAPANESE_ADDRESSES) 12 | prefecture2city = dict() 13 | for prefecture, groups1 in japanese_addresses.groupby(prefecture_col): 14 | city2street = dict() 15 | for city, groups2 in groups1.groupby(city_col): 16 | # numpy.array to set 17 | city2street[city] = set(groups2[street_col].unique()) 18 | prefecture2city[prefecture] = city2street 19 | save_path = 'prefecture2city2street.pkl' 20 | with open(save_path, mode='wb') as f: 21 | pickle.dump(prefecture2city, f) 22 | 23 | 24 | if __name__ == '__main__': 25 | main() 26 | -------------------------------------------------------------------------------- /.github/workflows/pythonpackage.yml: -------------------------------------------------------------------------------- 1 | name: Python package 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | strategy: 10 | matrix: 11 | python-version: [3.6, 3.7, 3.8] 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Set up Python ${{ matrix.python-version }} 16 | uses: actions/setup-python@v1 17 | with: 18 | python-version: ${{ matrix.python-version }} 19 | - name: Install Poetry 20 | run: | 21 | python -m pip install --upgrade pip setuptools poetry 22 | pip install tox 23 | 24 | - name: Install dependencies 25 | run: | 26 | poetry run pip install -U pip 27 | poetry update 28 | poetry install 29 | 30 | - name: Run pytest 31 | run: poetry run pytest 32 | 33 | - name: Upload coverage to Codecov 34 | uses: codecov/codecov-action@v1 35 | with: 36 | token: ${{ secrets.CODECOV_TOKEN }} 37 | file: ./coverage.xml 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 wakame 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/update.yml: -------------------------------------------------------------------------------- 1 | name: update japanese-addresses on dispath 2 | 3 | on: workflow_dispatch 4 | 5 | jobs: 6 | update_japanese_addresses: 7 | 8 | runs-on: ubuntu-latest 9 | strategy: 10 | matrix: 11 | python-version: [3.9] 12 | env: 13 | RESULT_PATH: prefecture2city2street.pkl 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Set up Python ${{ matrix.python-version }} 17 | uses: actions/setup-python@v2 18 | with: 19 | python-version: ${{ matrix.python-version }} 20 | - name: Install dependencies 21 | run: | 22 | python -m pip install --upgrade pip 23 | pip install pandas 24 | - name: create pkl 25 | run: | 26 | python scripts/csv_to_dict.py 27 | mv ${{ env.RESULT_PATH }} japanese_addresses/${{ env.RESULT_PATH }} 28 | - name: Create commits 29 | run: | 30 | git config --global user.name "GitHub Action" 31 | git config --global user.email "github-actions[bot]@users.noreply.github.com" 32 | git commit -am "Add japanese-addresses" 33 | - name: Create Pull Request 34 | uses: peter-evans/create-pull-request@v3 35 | with: 36 | title: Update japanese-addresses 37 | labels: update file, automated pr 38 | body: > 39 | This PR is auto-generated by 40 | [create-pull-request](https://github.com/peter-evans/create-pull-request). 41 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Python 3", 3 | "build": { 4 | "dockerfile": "Dockerfile", 5 | "context": "..", 6 | "args": { 7 | "VARIANT": "3" 8 | } 9 | }, 10 | "settings": { 11 | "editor.formatOnSave": true, 12 | "terminal.integrated.shell.linux": "/bin/bash", 13 | "python.pythonPath": "/usr/local/bin/python", 14 | "python.formatting.provider": "black", 15 | "python.linting.enabled": true, 16 | "python.linting.flake8Enabled": true, 17 | "python.linting.mypyEnabled": true, 18 | "python.linting.pydocstyleEnabled": true, 19 | "python.linting.pylintEnabled": false, 20 | "python.testing.pytestEnabled": true, 21 | "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", 22 | "python.formatting.blackPath": "/usr/local/py-utils/bin/black", 23 | "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", 24 | "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", 25 | "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", 26 | "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", 27 | "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", 28 | "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", 29 | "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint", 30 | "python.testing.pytestPath": "/usr/local/py-utils/bin/pytest" 31 | }, 32 | "extensions": [ 33 | "EditorConfig.EditorConfig", 34 | "ms-python.python" 35 | ], 36 | "postCreateCommand": "pip install pre-commit tox && pre-commit install" 37 | } 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /tests/test_address.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from dataclasses import is_dataclass 3 | 4 | from japanese_addresses import separate_address, ParsedAddress 5 | 6 | 7 | def is_dataclass_instance(obj): 8 | return is_dataclass(obj) and not isinstance(obj, type) 9 | 10 | 11 | def is_default_value(parsed_address: ParsedAddress): 12 | assert parsed_address.prefecture == '' 13 | assert parsed_address.city == '' 14 | 15 | 16 | def test_separate_address(): 17 | parsed_address = separate_address('') 18 | assert is_dataclass_instance(parsed_address) 19 | is_default_value(parsed_address) 20 | 21 | # TODO: detect with invalid value 22 | parsed_address = separate_address('京東都') 23 | assert is_dataclass_instance(parsed_address) 24 | 25 | 26 | test_data = [ 27 | ('鹿児島県志布志市志布志町志布志2丁目', ('鹿児島県', '志布志市', '志布志町志布志二丁目')), 28 | ('鹿児島県志布志市志布志町志布志', ('鹿児島県', '志布志市', '志布志町志布志')), 29 | ('奈良県高市郡高取町大字兵庫', ('奈良県', '高市郡高取町', '大字兵庫')), 30 | ('山形県西村山郡河北町大字岩木山口', ('山形県', '西村山郡河北町', '大字岩木')), 31 | ('佐賀県杵島郡大町町大字大町上大町', ('佐賀県', '杵島郡大町町', '大字大町')), 32 | ('北海道余市郡余市町朝日町', ('北海道', '余市郡余市町', '朝日町')), 33 | ('宮城県仙台市泉区市名坂字東裏97-1', ('宮城県', '仙台市泉区', '市名坂')), 34 | ('奈良県高市郡高取町', ('奈良県', '高市郡高取町', '')), 35 | ('北海道余市郡余市町黒川町', ('北海道', '余市郡余市町', '黒川町')), 36 | ('石川県野々市市', ('石川県', '野々市市', '')), 37 | ('岐阜県山県市', ('岐阜県', '山県市', '')), 38 | ('岐阜県郡上市', ('岐阜県', '郡上市', '')), 39 | ('千葉県市川市', ('千葉県', '市川市', '')), 40 | ('東京都', ('東京都', '', '')), 41 | ('台東区', ('', '', '')), 42 | ] 43 | 44 | 45 | @pytest.mark.parametrize('address, expect', test_data) 46 | def test_separate_japanese_addresses(address, expect): 47 | prefecture, city, street = expect 48 | parsed_address = separate_address(address) 49 | assert parsed_address.prefecture == prefecture 50 | assert parsed_address.city == city 51 | assert parsed_address.street == street 52 | -------------------------------------------------------------------------------- /japanese_addresses/__init__.py: -------------------------------------------------------------------------------- 1 | """Awesome package.""" 2 | import logging 3 | import pickle 4 | import re 5 | from pathlib import Path 6 | from typing import Iterable 7 | from dataclasses import dataclass 8 | from kanjize import int2kanji 9 | 10 | DIR_PATH = Path(__file__).parent 11 | pkl_name = 'prefecture2city2street.pkl' 12 | logger = logging.getLogger(__name__) 13 | handler = logging.StreamHandler() 14 | 15 | logger.addHandler(handler) 16 | 17 | logger.setLevel(logging.INFO) 18 | 19 | with open(str(DIR_PATH / pkl_name), 'rb') as f: 20 | prefecture2city = pickle.load(f) 21 | 22 | __number_pat = re.compile(r'(\d+)') 23 | 24 | 25 | @dataclass 26 | class ParsedAddress: 27 | prefecture: str = '' 28 | city: str = '' 29 | street: str = '' 30 | 31 | 32 | def number2kansuji(number_in_string: str) -> str: 33 | """ 34 | 35 | Args: 36 | number_in_string: 37 | 38 | Returns: 39 | Example: 40 | >>> number2kansuji('北1条西12丁目') 41 | '北一条西十二丁目' 42 | >>> number2kansuji('北1条西12丁目') 43 | '北一条西十二丁目' 44 | """ 45 | number_in_string_sub = number_in_string 46 | for match in __number_pat.finditer(number_in_string): 47 | number = match.group() 48 | kansuji = int2kanji(int(number)) 49 | split_string = list(number_in_string_sub) 50 | split_string[match.start():match.end()] = kansuji 51 | number_in_string_sub = ''.join(split_string) 52 | return number_in_string_sub 53 | 54 | 55 | def _longest_match_search(address: str, search_target: Iterable) -> str: 56 | matched_length = 0 57 | matched_key = '' 58 | # longest match 59 | for key in search_target: 60 | matched = address.startswith(key) 61 | if matched and (len(key) > matched_length): 62 | matched_key = key 63 | matched_length = len(key) 64 | return matched_key 65 | 66 | 67 | def separate_address(address: str) -> ParsedAddress: 68 | """ 69 | 70 | Args: 71 | address: 72 | 73 | Returns: 74 | 75 | Example: 76 | >>> separate_address('北海道札幌市中央区北1条西2丁目') 77 | ParsedAddress(prefecture='北海道', city='札幌市中央区', street='北一条西二丁目') 78 | >>> separate_address('奈良県高市郡高取町') 79 | ParsedAddress(prefecture='奈良県', city='高市郡高取町', street='') 80 | """ 81 | address = address.strip() 82 | address = number2kansuji(address) 83 | parsed_address = ParsedAddress() 84 | 85 | if len(address) == 0: 86 | return parsed_address 87 | 88 | prefecture = _longest_match_search(address, prefecture2city.keys()) 89 | # not found 90 | if not prefecture: 91 | return parsed_address 92 | 93 | city2street = prefecture2city.get(prefecture) 94 | 95 | # remove a string of matching prefectures 96 | address = address.replace(prefecture, '') 97 | address = address.strip() 98 | parsed_address.prefecture = prefecture 99 | 100 | if len(address) == 0: 101 | return parsed_address 102 | 103 | city = _longest_match_search(address, city2street.keys()) 104 | # not found 105 | if not city: 106 | return parsed_address 107 | 108 | streets = city2street.get(city) 109 | 110 | # remove a string of matching cities 111 | address = address.replace(city, '') 112 | address = address.strip() 113 | parsed_address.city = city 114 | 115 | if len(address) == 0: 116 | return parsed_address 117 | 118 | street = _longest_match_search(address, streets) 119 | 120 | # not found 121 | if not street: 122 | return parsed_address 123 | 124 | # remove a string of matching cities 125 | address = address.replace(street, '') 126 | address = address.strip() 127 | parsed_address.street = street 128 | 129 | return parsed_address 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # japanese-addresses 2 | 3 | [![PyPI version](https://badge.fury.io/py/japanese-addresses.svg)](https://badge.fury.io/py/japanese-addresses) 4 | [![Python package](https://github.com/wakamezake/japanese-addresses/workflows/Python%20package/badge.svg?branch=master)](https://github.com/wakamezake/japanese-addresses/actions?query=workflow%3A%22Python+package%22) 5 | [![codecov](https://codecov.io/gh/wakamezake/japanese-addresses/branch/master/graph/badge.svg)](https://codecov.io/gh/wakamezake/japanese-addresses) 6 | [![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/wakamezake/japanese-addresses/master) 7 | 8 | Parsing Japan addresses to prefectures and cities. 9 | 10 | ## Installation 11 | 12 | ``` 13 | pip install japanese-addresses 14 | ``` 15 | 16 | ## Examples 17 | 18 | ```python 19 | from japanese_addresses import separate_address 20 | 21 | parsed_address = separate_address('宮城県仙台市泉区市名坂字東裏97-1') 22 | 23 | print(parsed_address) 24 | """ 25 | ParsedAddress(prefecture='宮城県', city='仙台市泉区', street='市名坂') 26 | """ 27 | 28 | parsed_address = separate_address('鹿児島県志布志市志布志町志布志') 29 | 30 | print(parsed_address) 31 | """ 32 | ParsedAddress(prefecture='鹿児島県', city='志布志市', street='志布志町志布志') 33 | """ 34 | ``` 35 | 36 | How to use it in combination with pandas. 37 | 38 | ```python 39 | import pandas as pd 40 | from japanese_addresses import separate_address 41 | 42 | df = pd.read_csv('sample.csv') 43 | df.head() 44 | """ 45 | address 46 | 0 宮城県仙台市泉区市名坂字東裏97-1 47 | 1 鹿児島県志布志市志布志町志布志 48 | 2 東京都 神津島村284番 49 | """ 50 | target_col = 'address' 51 | 52 | # https://stackoverflow.com/questions/16236684/apply-pandas-function-to-column-to-create-multiple-new-columns 53 | def get_separate_address(address): 54 | parsed_address = separate_address(address) 55 | return parsed_address.prefecture, parsed_address.city, parsed_address.street 56 | 57 | 58 | df['prefecture'], df['city'], df['street']= zip(*df[target_col].map(get_separate_address)) 59 | df.head() 60 | """ 61 | address prefecture city street 62 | 0 宮城県仙台市泉区市名坂字東裏97-1 宮城県 仙台市泉区 市名坂 63 | 1 鹿児島県志布志市志布志町志布志 鹿児島県 志布志市 志布志町志布志 64 | 2 東京都 神津島村284番 東京都 神津島村 65 | """ 66 | ``` 67 | 68 | ## Testing 69 | 70 | ``` 71 | pip install poetry 72 | poetry install 73 | poetry run pytest 74 | ``` 75 | 76 | ## License 77 | Japanese_addresses are licensed under [MIT](https://github.com/wakamezake/japanese-addresses/blob/master/LICENSE) 78 | 79 | ### [prefecture2city2street.pkl](https://github.com/wakamezake/japanese-addresses/blob/master/japanese_addresses/prefecture2city2street.pkl) 80 | 81 | [prefecture2city2street.pkl](https://github.com/wakamezake/japanese-addresses/blob/master/japanese_addresses/prefecture2city2street.pkl) is a derivative work with a modification of [geolonia 82 | / 83 | japanese-addresses](https://github.com/geolonia/japanese-addresses) 84 | 85 | Also, [prefecture2city2street.pkl](https://github.com/wakamezake/japanese-addresses/blob/master/japanese_addresses/prefecture2city2street.pkl) was created using [csv_to_dict.py](https://github.com/wakamezake/japanese-addresses/blob/master/scripts/csv_to_dict.py). 86 | 87 | ### Information on the original work 88 | 89 | Here's the link to the original work. 90 | 91 | https://geolonia.github.io/japanese-addresses/ 92 | 93 | [![geolonia/japanese-addresses - GitHub](https://gh-card.dev/repos/geolonia/japanese-addresses.svg)](https://github.com/geolonia/japanese-addresses) 94 | 95 | The following is written in Japanese according to the description of the original work. 96 | 97 | #### タイトル 98 | Geolonia 住所データ 99 | 100 | #### 出典 101 | 本データは、以下のデータを元に、毎月 Geolonia にて更新作業を行っています。 102 | - [国土交通省位置参照情報ダウンロードサイト](https://nlftp.mlit.go.jp/cgi-bin/isj/dls/_choose_method.cgi) 103 | - [郵便番号データダウンロード - 日本郵便](https://www.post.japanpost.jp/zipcode/download.html) 104 | 105 | #### スポンサー 106 | [一般社団法人 不動産テック協会](https://retechjapan.org/) 107 | 108 | #### ライセンス 109 | [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja) 110 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | category = "dev" 3 | description = "Atomic file writes." 4 | marker = "sys_platform == \"win32\"" 5 | name = "atomicwrites" 6 | optional = false 7 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 8 | version = "1.4.0" 9 | 10 | [[package]] 11 | category = "dev" 12 | description = "Classes Without Boilerplate" 13 | name = "attrs" 14 | optional = false 15 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 16 | version = "19.3.0" 17 | 18 | [package.extras] 19 | azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] 20 | dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] 21 | docs = ["sphinx", "zope.interface"] 22 | tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] 23 | 24 | [[package]] 25 | category = "dev" 26 | description = "Cross-platform colored terminal text." 27 | marker = "sys_platform == \"win32\"" 28 | name = "colorama" 29 | optional = false 30 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 31 | version = "0.4.3" 32 | 33 | [[package]] 34 | category = "main" 35 | description = "A backport of the dataclasses module for Python 3.6" 36 | marker = "python_version >= \"3.6\" and python_version < \"3.7\"" 37 | name = "dataclasses" 38 | optional = false 39 | python-versions = ">=3.6, <3.7" 40 | version = "0.7" 41 | 42 | [[package]] 43 | category = "dev" 44 | description = "Read metadata from Python packages" 45 | marker = "python_version < \"3.8\"" 46 | name = "importlib-metadata" 47 | optional = false 48 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 49 | version = "1.7.0" 50 | 51 | [package.dependencies] 52 | zipp = ">=0.5" 53 | 54 | [package.extras] 55 | docs = ["sphinx", "rst.linker"] 56 | testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] 57 | 58 | [[package]] 59 | category = "dev" 60 | description = "iniconfig: brain-dead simple config-ini parsing" 61 | name = "iniconfig" 62 | optional = false 63 | python-versions = "*" 64 | version = "1.0.1" 65 | 66 | [[package]] 67 | category = "main" 68 | description = "Easy converter between Kanji-Number and Integer" 69 | name = "kanjize" 70 | optional = false 71 | python-versions = "*" 72 | version = "0.1.0" 73 | 74 | [[package]] 75 | category = "dev" 76 | description = "More routines for operating on iterables, beyond itertools" 77 | name = "more-itertools" 78 | optional = false 79 | python-versions = ">=3.5" 80 | version = "8.4.0" 81 | 82 | [[package]] 83 | category = "dev" 84 | description = "NumPy is the fundamental package for array computing with Python." 85 | name = "numpy" 86 | optional = false 87 | python-versions = ">=3.6" 88 | version = "1.19.1" 89 | 90 | [[package]] 91 | category = "dev" 92 | description = "Core utilities for Python packages" 93 | name = "packaging" 94 | optional = false 95 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 96 | version = "20.4" 97 | 98 | [package.dependencies] 99 | pyparsing = ">=2.0.2" 100 | six = "*" 101 | 102 | [[package]] 103 | category = "dev" 104 | description = "Powerful data structures for data analysis, time series, and statistics" 105 | name = "pandas" 106 | optional = false 107 | python-versions = ">=3.6.1" 108 | version = "1.1.0" 109 | 110 | [package.dependencies] 111 | numpy = ">=1.15.4" 112 | python-dateutil = ">=2.7.3" 113 | pytz = ">=2017.2" 114 | 115 | [package.extras] 116 | test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"] 117 | 118 | [[package]] 119 | category = "dev" 120 | description = "plugin and hook calling mechanisms for python" 121 | name = "pluggy" 122 | optional = false 123 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 124 | version = "0.13.1" 125 | 126 | [package.dependencies] 127 | [package.dependencies.importlib-metadata] 128 | python = "<3.8" 129 | version = ">=0.12" 130 | 131 | [package.extras] 132 | dev = ["pre-commit", "tox"] 133 | 134 | [[package]] 135 | category = "dev" 136 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 137 | name = "py" 138 | optional = false 139 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 140 | version = "1.9.0" 141 | 142 | [[package]] 143 | category = "dev" 144 | description = "Python parsing module" 145 | name = "pyparsing" 146 | optional = false 147 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 148 | version = "2.4.7" 149 | 150 | [[package]] 151 | category = "dev" 152 | description = "pytest: simple powerful testing with Python" 153 | name = "pytest" 154 | optional = false 155 | python-versions = ">=3.5" 156 | version = "6.0.1" 157 | 158 | [package.dependencies] 159 | atomicwrites = ">=1.0" 160 | attrs = ">=17.4.0" 161 | colorama = "*" 162 | iniconfig = "*" 163 | more-itertools = ">=4.0.0" 164 | packaging = "*" 165 | pluggy = ">=0.12,<1.0" 166 | py = ">=1.8.2" 167 | toml = "*" 168 | 169 | [package.dependencies.importlib-metadata] 170 | python = "<3.8" 171 | version = ">=0.12" 172 | 173 | [package.extras] 174 | checkqa_mypy = ["mypy (0.780)"] 175 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 176 | 177 | [[package]] 178 | category = "dev" 179 | description = "Extensions to the standard Python datetime module" 180 | name = "python-dateutil" 181 | optional = false 182 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 183 | version = "2.8.1" 184 | 185 | [package.dependencies] 186 | six = ">=1.5" 187 | 188 | [[package]] 189 | category = "dev" 190 | description = "World timezone definitions, modern and historical" 191 | name = "pytz" 192 | optional = false 193 | python-versions = "*" 194 | version = "2020.1" 195 | 196 | [[package]] 197 | category = "dev" 198 | description = "Python 2 and 3 compatibility utilities" 199 | name = "six" 200 | optional = false 201 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 202 | version = "1.15.0" 203 | 204 | [[package]] 205 | category = "dev" 206 | description = "Python Library for Tom's Obvious, Minimal Language" 207 | name = "toml" 208 | optional = false 209 | python-versions = "*" 210 | version = "0.10.1" 211 | 212 | [[package]] 213 | category = "dev" 214 | description = "Backport of pathlib-compatible object wrapper for zip files" 215 | marker = "python_version < \"3.8\"" 216 | name = "zipp" 217 | optional = false 218 | python-versions = ">=3.6" 219 | version = "3.1.0" 220 | 221 | [package.extras] 222 | docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] 223 | testing = ["jaraco.itertools", "func-timeout"] 224 | 225 | [metadata] 226 | content-hash = "c094aeed0ff1fcf6f11b06946484f7f8b4610838e0e5b274d06b849ebf8b2095" 227 | python-versions = "^3.6.1" 228 | 229 | [metadata.files] 230 | atomicwrites = [ 231 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 232 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 233 | ] 234 | attrs = [ 235 | {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, 236 | {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, 237 | ] 238 | colorama = [ 239 | {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, 240 | {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, 241 | ] 242 | dataclasses = [ 243 | {file = "dataclasses-0.7-py3-none-any.whl", hash = "sha256:3459118f7ede7c8bea0fe795bff7c6c2ce287d01dd226202f7c9ebc0610a7836"}, 244 | {file = "dataclasses-0.7.tar.gz", hash = "sha256:494a6dcae3b8bcf80848eea2ef64c0cc5cd307ffc263e17cdf42f3e5420808e6"}, 245 | ] 246 | importlib-metadata = [ 247 | {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, 248 | {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, 249 | ] 250 | iniconfig = [ 251 | {file = "iniconfig-1.0.1-py3-none-any.whl", hash = "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437"}, 252 | {file = "iniconfig-1.0.1.tar.gz", hash = "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"}, 253 | ] 254 | kanjize = [ 255 | {file = "kanjize-0.1.0.tar.gz", hash = "sha256:8f808b02acc8d2f2466792598460f2acf82aca49042f6b6ccf714ccd98e1cd29"}, 256 | ] 257 | more-itertools = [ 258 | {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, 259 | {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, 260 | ] 261 | numpy = [ 262 | {file = "numpy-1.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1cca51512299841bf69add3b75361779962f9cee7d9ee3bb446d5982e925b69"}, 263 | {file = "numpy-1.19.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c9591886fc9cbe5532d5df85cb8e0cc3b44ba8ce4367bd4cf1b93dc19713da72"}, 264 | {file = "numpy-1.19.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cf1347450c0b7644ea142712619533553f02ef23f92f781312f6a3553d031fc7"}, 265 | {file = "numpy-1.19.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed8a311493cf5480a2ebc597d1e177231984c818a86875126cfd004241a73c3e"}, 266 | {file = "numpy-1.19.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3673c8b2b29077f1b7b3a848794f8e11f401ba0b71c49fbd26fb40b71788b132"}, 267 | {file = "numpy-1.19.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:56ef7f56470c24bb67fb43dae442e946a6ce172f97c69f8d067ff8550cf782ff"}, 268 | {file = "numpy-1.19.1-cp36-cp36m-win32.whl", hash = "sha256:aaf42a04b472d12515debc621c31cf16c215e332242e7a9f56403d814c744624"}, 269 | {file = "numpy-1.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:082f8d4dd69b6b688f64f509b91d482362124986d98dc7dc5f5e9f9b9c3bb983"}, 270 | {file = "numpy-1.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e4f6d3c53911a9d103d8ec9518190e52a8b945bab021745af4939cfc7c0d4a9e"}, 271 | {file = "numpy-1.19.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:5b6885c12784a27e957294b60f97e8b5b4174c7504665333c5e94fbf41ae5d6a"}, 272 | {file = "numpy-1.19.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1bc0145999e8cb8aed9d4e65dd8b139adf1919e521177f198529687dbf613065"}, 273 | {file = "numpy-1.19.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:5a936fd51049541d86ccdeef2833cc89a18e4d3808fe58a8abeb802665c5af93"}, 274 | {file = "numpy-1.19.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ef71a1d4fd4858596ae80ad1ec76404ad29701f8ca7cdcebc50300178db14dfc"}, 275 | {file = "numpy-1.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b9792b0ac0130b277536ab8944e7b754c69560dac0415dd4b2dbd16b902c8954"}, 276 | {file = "numpy-1.19.1-cp37-cp37m-win32.whl", hash = "sha256:b12e639378c741add21fbffd16ba5ad25c0a1a17cf2b6fe4288feeb65144f35b"}, 277 | {file = "numpy-1.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:8343bf67c72e09cfabfab55ad4a43ce3f6bf6e6ced7acf70f45ded9ebb425055"}, 278 | {file = "numpy-1.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e45f8e981a0ab47103181773cc0a54e650b2aef8c7b6cd07405d0fa8d869444a"}, 279 | {file = "numpy-1.19.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:667c07063940e934287993366ad5f56766bc009017b4a0fe91dbd07960d0aba7"}, 280 | {file = "numpy-1.19.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:480fdd4dbda4dd6b638d3863da3be82873bba6d32d1fc12ea1b8486ac7b8d129"}, 281 | {file = "numpy-1.19.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:935c27ae2760c21cd7354402546f6be21d3d0c806fffe967f745d5f2de5005a7"}, 282 | {file = "numpy-1.19.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:309cbcfaa103fc9a33ec16d2d62569d541b79f828c382556ff072442226d1968"}, 283 | {file = "numpy-1.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7ed448ff4eaffeb01094959b19cbaf998ecdee9ef9932381420d514e446601cd"}, 284 | {file = "numpy-1.19.1-cp38-cp38-win32.whl", hash = "sha256:de8b4a9b56255797cbddb93281ed92acbc510fb7b15df3f01bd28f46ebc4edae"}, 285 | {file = "numpy-1.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:92feb989b47f83ebef246adabc7ff3b9a59ac30601c3f6819f8913458610bdcc"}, 286 | {file = "numpy-1.19.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:e1b1dc0372f530f26a03578ac75d5e51b3868b9b76cd2facba4c9ee0eb252ab1"}, 287 | {file = "numpy-1.19.1.zip", hash = "sha256:b8456987b637232602ceb4d663cb34106f7eb780e247d51a260b84760fd8f491"}, 288 | ] 289 | packaging = [ 290 | {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, 291 | {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, 292 | ] 293 | pandas = [ 294 | {file = "pandas-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:47a03bfef80d6812c91ed6fae43f04f2fa80a4e1b82b35aa4d9002e39529e0b8"}, 295 | {file = "pandas-1.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0210f8fe19c2667a3817adb6de2c4fd92b1b78e1975ca60c0efa908e0985cbdb"}, 296 | {file = "pandas-1.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:35db623487f00d9392d8af44a24516d6cb9f274afaf73cfcfe180b9c54e007d2"}, 297 | {file = "pandas-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:4d1a806252001c5db7caecbe1a26e49a6c23421d85a700960f6ba093112f54a1"}, 298 | {file = "pandas-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9f61cca5262840ff46ef857d4f5f65679b82188709d0e5e086a9123791f721c8"}, 299 | {file = "pandas-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:182a5aeae319df391c3df4740bb17d5300dcd78034b17732c12e62e6dd79e4a4"}, 300 | {file = "pandas-1.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:40ec0a7f611a3d00d3c666c4cceb9aa3f5bf9fbd81392948a93663064f527203"}, 301 | {file = "pandas-1.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:16504f915f1ae424052f1e9b7cd2d01786f098fbb00fa4e0f69d42b22952d798"}, 302 | {file = "pandas-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:fc714895b6de6803ac9f661abb316853d0cd657f5d23985222255ad76ccedc25"}, 303 | {file = "pandas-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a15835c8409d5edc50b4af93be3377b5dd3eb53517e7f785060df1f06f6da0e2"}, 304 | {file = "pandas-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0bc440493cf9dc5b36d5d46bbd5508f6547ba68b02a28234cd8e81fdce42744d"}, 305 | {file = "pandas-1.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4b21d46728f8a6be537716035b445e7ef3a75dbd30bd31aa1b251323219d853e"}, 306 | {file = "pandas-1.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0227e3a6e3a22c0e283a5041f1e3064d78fbde811217668bb966ed05386d8a7e"}, 307 | {file = "pandas-1.1.0-cp38-cp38-win32.whl", hash = "sha256:ed60848caadeacecefd0b1de81b91beff23960032cded0ac1449242b506a3b3f"}, 308 | {file = "pandas-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:60e20a4ab4d4fec253557d0fc9a4e4095c37b664f78c72af24860c8adcd07088"}, 309 | {file = "pandas-1.1.0.tar.gz", hash = "sha256:b39508562ad0bb3f384b0db24da7d68a2608b9ddc85b1d931ccaaa92d5e45273"}, 310 | ] 311 | pluggy = [ 312 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, 313 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, 314 | ] 315 | py = [ 316 | {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, 317 | {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, 318 | ] 319 | pyparsing = [ 320 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 321 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 322 | ] 323 | pytest = [ 324 | {file = "pytest-6.0.1-py3-none-any.whl", hash = "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad"}, 325 | {file = "pytest-6.0.1.tar.gz", hash = "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4"}, 326 | ] 327 | python-dateutil = [ 328 | {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, 329 | {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, 330 | ] 331 | pytz = [ 332 | {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, 333 | {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, 334 | ] 335 | six = [ 336 | {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, 337 | {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, 338 | ] 339 | toml = [ 340 | {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, 341 | {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, 342 | ] 343 | zipp = [ 344 | {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, 345 | {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, 346 | ] 347 | --------------------------------------------------------------------------------