Skip to main content

ISO 国家、细分、语言、货币和脚本定义及其翻译

项目描述

pycountry

pycountry 提供标准的 ISO 数据库:

该软件包包括一份来自 Debian 的pkg-isocodes的副本,并使数据可以通过 Python API 访问。

还包括各种字符串的翻译文件。

数据更新政策

pycountry 不会接受对数据的任何更改。这是使用来自 Debian的pkg-isocodes数据库的 ISO 标准的纯包装。如果您需要改变世界政治局势,请与 ISO 或 Debian 人员交谈,而不是我。

捐款/金钱支持

这是我在个人时间维护的一个小项目。我对个人经济利益不感兴趣。但是,如果您想支持该项目,那么如果您愿意捐赠给Feminist Frequency ,我会很高兴。此外,让世界知道你这样做了,以便其他人可以跟随你的道路。

贡献

代码位于GitHub 上的 git 存储库中,问题也必须在其中报告。

国家 (ISO 3166)

可以通过在导入 pycountry 时已配置的数据库对象访问国家/地区,并作为可迭代对象:

>>> import pycountry
>>> len(pycountry.countries)
249
>>> list(pycountry.countries)[0]
Country(alpha_2='AF', alpha_3='AFG', name='Afghanistan', numeric='004', official_name='Islamic Republic of Afghanistan')

可以通过其各种代码查找特定国家,并提供标准中包含的信息作为属性:

>>> germany = pycountry.countries.get(alpha_2='DE')
>>> germany
Country(alpha_2='DE', alpha_3='DEU', name='Germany', numeric='276', official_name='Federal Republic of Germany')
>>> germany.alpha_2
'DE'
>>> germany.alpha_3
'DEU'
>>> germany.numeric
'276'
>>> germany.name
'Germany'
>>> germany.official_name
'Federal Republic of Germany'

history_countries数据库包含已从标准中删除并现在包含在 ISO 3166-3 中的以前的国家/地区,不包括现有国家:

>>> ussr = pycountry.historic_countries.get(alpha_3='SUN')
>>> ussr
Country(alpha_3='SUN', alpha_4='SUHH', withdrawal_date='1992-08-30', name='USSR, Union of Soviet Socialist Republics', numeric='810')
>>> ussr.alpha_4
'SUHH'
>>> ussr.alpha_3
'SUN'
>>> ussr.name
'USSR, Union of Soviet Socialist Republics'
>>> ussr.withdrawal_date
'1992-08-30'

还有一个“模糊”搜索可以帮助人们发现“正确”国家的名称,这些名称实际上可能只是细分。模糊性还包括规范化 unicode 口音。还包括一些优先级,以在细分名称之前优先匹配国家/地区名称,并将匹配较多的国家列在匹配较少的国家之前:

>>> pycountry.countries.search_fuzzy('England')
[Country(alpha_2='GB', alpha_3='GBR', name='United Kingdom', numeric='826', official_name='United Kingdom of Great Britain and Northern Ireland')]

>>> pycountry.countries.search_fuzzy('Cote')
[Country(alpha_2='CI', alpha_3='CIV', name="Côte d'Ivoire", numeric='384', official_name="Republic of Côte d'Ivoire"),
 Country(alpha_2='FR', alpha_3='FRA', name='France', numeric='250', official_name='French Republic'),
 Country(alpha_2='HN', alpha_3='HND', name='Honduras', numeric='340', official_name='Republic of Honduras')]

国家细分 (ISO 3166-2)

国家细分比国家本身复杂一点,因为它们提供了嵌套和类型化的结构。

所有细分都可以直接访问:

>>> len(pycountry.subdivisions)
4847
>>> list(pycountry.subdivisions)[0]
Subdivision(code='AD-07', country_code='AD', name='Andorra la Vella', parent_code=None, type='Parish')

可以使用其唯一代码访问细分,并至少提供其代码、名称和类型:

>>> de_st = pycountry.subdivisions.get(code='DE-ST')
>>> de_st.code
'DE-ST'
>>> de_st.name
'Sachsen-Anhalt'
>>> de_st.type
'State'
>>> de_st.country
Country(alpha_2='DE', alpha_3='DEU', name='Germany', numeric='276', official_name='Federal Republic of Germany')

一些细分将另一个细分指定为父级:

>>> al_br = pycountry.subdivisions.get(code='AL-BU')
>>> al_br.code
'AL-BU'
>>> al_br.name
'Bulqiz\xeb'
>>> al_br.type
'District'
>>> al_br.parent_code
'AL-09'
>>> al_br.parent
Subdivision(code='AL-09', country_code='AL', name='Dib\xebr', parent_code=None, type='County')
>>> al_br.parent.name
'Dib\xebr'

可以使用 country_code 索引查询单个国家的分区:

>>> len(pycountry.subdivisions.get(country_code='DE'))
16

>>> len(pycountry.subdivisions.get(country_code='US'))
57

脚本 (ISO 15924)

脚本可从类似于国家/地区的数据库中获得:

>>> len(pycountry.scripts)
169
>>> list(pycountry.scripts)[0]
Script(alpha_4='Afak', name='Afaka', numeric='439')

>>> latin = pycountry.scripts.get(name='Latin')
>>> latin
Script(alpha_4='Latn', name='Latin', numeric='215')
>>> latin.alpha4
'Latn'
>>> latin.name
'Latin'
>>> latin.numeric
'215'

货币 (ISO 4217)

货币数据库再次与之前的相似:

>>> len(pycountry.currencies)
182
>>> list(pycountry.currencies)[0]
Currency(alpha_3='AED', name='UAE Dirham', numeric='784')
>>> argentine_peso = pycountry.currencies.get(alpha_3='ARS')
>>> argentine_peso
Currency(alpha_3='ARS', name='Argentine Peso', numeric='032')
>>> argentine_peso.alpha_3
'ARS'
>>> argentine_peso.name
'Argentine Peso'
>>> argentine_peso.numeric
'032'

语言 (ISO 639-3)

语言数据库也类似:

>>> len(pycountry.languages)
7874
>>> list(pycountry.languages)[0]
Language(alpha_3='aaa', name='Ghotuo', scope='I', type='L')

>>> aragonese = pycountry.languages.get(alpha_2='an')
>>> aragonese.alpha_2
'an'
>>> aragonese.alpha_3
'arg'
>>> aragonese.name
'Aragonese'

>>> bengali = pycountry.languages.get(alpha_2='bn')
>>> bengali.name
'Bengali'
>>> bengali.common_name
'Bangla'

语言环境

语言环境在这个包的pycountry.LOCALES_DIR子目录中可用。根据它们提供翻译的标准,翻译域被称为isoXXX 。该目录的结构与 Python 的 gettext 模块兼容。

这是翻译语言名称的示例:

>>> import gettext
>>> german = gettext.translation('iso3166', pycountry.LOCALES_DIR,
...                              languages=['de'])
>>> german.install()
>>> _('Germany')
'Deutschland'

查找

对于每个数据库(国家、语言、脚本等),您还可以不区分大小写地查找实体,而无需知道值可能匹配哪个键。例如:

>>> pycountry.countries.lookup('de')
<pycountry.db.Country object at 0x...>

搜索以返回的第一个匹配项结束。

变化

22.3.5 (2022-03-05)

  • 更新到 iso 代码 4.9.0。

22.1.10 (2022-01-10)

  • 更新到 iso 代码 4.8.0。(感谢 llimeht!)

20.7.3 (2020-07-03)

  • 修复错误 #37:(意外)无条件的 pkg_resources 导入。(谢谢,crbunney)

20.7.2 (2020-07-02)

  • 将(自动生成的)__version__ 属性添加到主模块。(修复问题 #4)

  • 向历史国家添加模糊搜索。(修复问题 #26)

  • 更新到 iso 代码 4.5.0。

  • PR 9:清理索引和搜索中值的规范化(小写)。有关详细讨论,请参阅 PR https://github.com/flyingcircusio/pycountry/pull/9。这也解决了问题 #8。

  • 较小的清理和构建环境版本的颠簸。

  • PR 35:仅 Python 3 的清理和更新的 Python 次要版本兼容性(感谢 Djailla)

  • PR 33:从 README 中删除失效的 bugtracker 链接(感谢 jwilk)

  • P3 32:(有点搞笑)错字(谢谢,jwilk)

  • 移至 Git/Github;从 Bitbucket Pipelines 切换到 Travis 构建。

19.8.18 (2019-08-18)

  • 修复在没有 UTF-8 作为默认编码的系统上的安装。(#13422)

  • 删除多余的打印调试输出。(#13424)

19.7.15 (2019-07-15)

  • 更新到 iso 代码 4.3。

  • 添加对 ISO 639-5(语言族和组)的支持。

  • 放弃对 Python 2 的支持。

  • search_fuzzy()函数添加到国家数据库。这允许处理并不真正了解 ISO 3166 的用户搜索(例如,实际的人类)。一些字符规范化和多个标准之间的优先匹配允许构建一些合理的建议/自动完成列表。(#13418)

    警告购买者:没有注意此功能的性能。

18.12.8 (2018-12-08)

警告:此版本包含一个微妙但重要的 API 更改,可能会破坏集成!

看着#13416,我意识到我在 Python 中get函数的行为方式方面做出了糟糕的 API 设计选择。可能是受到太少或太多威士忌的影响,我去实现了get 以便它引发 KeyError 而不是做 Pythonic 的事情并返回 None 并允许自定义default。在以前的版本中,围绕此代码有一些反复(特别是触及边缘情况以使 Subdivision API 行为“合理”,尽管那里似乎没有正确方法。)

无论如何,在准备此版本并查看 #13416 以及过去的其他相关问题和更改时,我注意到我的错误并决定继续修复它。

因此,从现在开始,get将在 Python 中按预期运行,是的,这意味着您现在必须仔细更新您的集成代码,检查 返回,而不是期待 KeyErrors。这是工作,但我认为在 Python 社区中维护这一约定是值得的。

  • 将 API 从“get + KeyError”切换到“get + default=None”。这是一个微妙的 API 破坏性更改。请谨慎更新。(#13416)

  • 更新到 ISO 代码 4.1。

18.5.26 (2018-05-26)

  • 修复 #13394:Subdivisions.get() 中不正确的 KeyError 阴影

  • 修复 #13398:使延迟加载线程安全。

18.5.20 (2018-05-20)

  • 更新到 iso 代码 3.79。

18.2.23 (2018-02-23)

  • 更新到 iso 代码 3.78。

17.9.23 (2017-09-23)

  • 更新到 iso-codes 3.76,修复了 #13398。

17.5.14 (2017-05-14)

  • 更新到 iso-codes 3.75,它再次修复了 #13389。(GB 的错误父代码)。

  • 从基于drone.io(已停止服务)的构建切换到bitbucket 的管道。

  • 更新 pytest 依赖项以消除 API 警告。

17.01.08 (2017-01-08)

  • 更新到 iso 代码 3.73,它修复了 #13389(CZ 的错误父代码)。

17.01.02 (2017-01-02)

  • 如果国家存在但没有任何细分,则从细分数据库返回空列表。修复 #13374。

  • 一些错字修复。感谢@VictorMireyev。

  • 更新到 iso-codes-3.72。

16.11.27.1 (2016-11-27)

  • 16.11.27 是一个棕色包发布。我在网上合并了 PR,但没有拉出来。出色地。这实际上应该是 16.11.27。

16.11.27 (2016-11-27)

  • 修复 Python 3 上的编码问题(似乎仅限于某些平台。)通过 PR17,修复 #13386。感谢@masroore 和@hiaselhans。

  • 文档修复:iso639_1_code 不再是语言的有效密钥。修复 #13387,感谢 @jmitzka。

  • 更新到 iso-codes-3.71。

16.11.08 (2016-11-08)

这个版本得到了@zware 的大力支持,他修复了我在上一个版本中忽略的一些问题和一些增强功能。

  • 所有数据对象现在都有一个包含所有值的 repr()。(@zware)

  • 所有数据库对象现在都有一个查找方法,该方法接受一个值并返回第一个具有与该值匹配的属性的数据对象。请注意,找到第一个匹配项时会停止搜索。(@zware)

  • 清理历史国家:已删除的标志消失了,不再存在同时保存历史国家和现在国家的数据库。记录格式差异太大,无法很好地保持这种外观。

  • 修复细分的父查找。

  • 更新 README 以正确显示更新的字段名称。

  • 更新我们所依赖的包的引脚。

  • 将 Python 测试覆盖率降低到 Python 2.7 和 3.5——我不能一直持续运行无数 Python 版本。

  • 修复 Python 3 兼容性 (@zware)

16.10.23rc3 (2016-10-23)

  • 在 #13375 中加入来自@Pander 的一些拼写错误和建议的 README 改进。

16.10.23rc2 (2016-10-23)

  • 使 README 适应新的属性。

16.10.23rc1 (2016-10-23)

这是一个重大变化。上游包已从以前的 XML 数据库改版为使用 JSON。他们稍微调整了他们的模式,因此使 pycountry 中的一些结构变得多余(耶!)。加载所有数据库时内存使用量下降(从 83.6 MiB 下降 32.7 MiB)并且性能上升(未进行科学测量,但在交互式会话中加载 DB 时很明显)。

为了标记这一重大变化,我还将使用 YY.MM.DD.micro 作为模式从现有的(无用的)基于 SemVer 的版本号切换到基于 CalVer 的版本号。

为了避免增加更多的复杂性,我删除了由于使用 XML 数据库的复杂性而真正需要的代码。

以下是您需要了解的内容:

  • 我更新到了 iso-codes 3.70,它比上一个版本更新了很多。

  • 属性名称已更改。源和对象属性之间不再存在映射。查看 JSON 文件(或检查对象)以了解支持哪些字段。

    您还可以检查自动构建的索引 (db.indices) 以查看数据库中的所有键。并非每个对象都支持每个属性 - 这取决于 pkg-isocodes 中数据的质量。

    属性名称现在也更加连贯。请注意,“alpha2”、“alpha4”等现在使用下划线,因为这是上游包中的模式。所以现在是“alpha_2”。

  • HistoricCountries 不再包括仍然存在的国家。我删除了旨在使其易于过滤的计算字段。

项目详情