首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

locale

locale模块打开对POSIX语言环境数据库和功能的访问。POSIX语言环境机制允许程序员处理应用程序中的某些文化问题,而不需要程序员知道执行该软件的每个国家的所有具体情况。

locale模块在_locale模块的顶部实现,如果可用,该模块又使用ANSI C语言环境实现。

locale模块定义了以下异常和功能:

exception locale.Error

当传递的区域设置setlocale()无法识别时引发异常。

locale.setlocale(category[, locale])

如果区域设置是给定的而不是None,则setlocale()修改该类别的区域设置。可用的类别在下面的数据描述中列出。语言环境可以是字符串,也可以是两个字符串(语言代码和编码)的迭代。如果它是可迭代的,则使用区域别名引擎将其转换为区域设置名称。一个空字符串指定用户的默认设置。如果区域设置的修改失败,Error则会引发异常。如果成功,则返回新的区域设置。

如果区域设置被省略None,则返回类别的当前设置。

setlocale()在大多数系统上不是线程安全的。应用程序通常以呼叫开始

代码语言:javascript
复制
import locale
locale.setlocale(locale.LC_ALL, '')

这将所有类别的区域设置设置为用户的默认设置(通常在LANG环境变量中指定)。如果此后区域设置未更改,则使用多线程不应导致问题。

版本2.0中更改:增加了对区域设置参数的可迭代值的支持。

locale.localeconv()

以字典形式返回本地约定的数据库。该字典具有以下字符串作为键:

类别

含义

LC_NUMERIC

'小数点'

小数点字符。

“分组”

数字序列指定'thousand_sep'预期的相对位置。如果序列以CHAR_MAX结束,则不会执行进一步的分组。如果序列以0结尾,则重复使用最后一个组的大小。

'thousands_sep'

组间使用的字符。

LC_MONETARY

'int_curr_symbol的'

国际货币符号。

'CURRENCY_SYMBOL'

当地的货币符号。

'p_cs_precedes / n_cs_precedes'

货币符号是否在价值之前(对于正值和负值)。

'p_sep_by_space / n_sep_by_space'

货币符号是否与空格分开(对于正值和负值)。

'mon_decimal_point'

用于货币价值的小数点。

'frac_digits'

货币值局部格式化中使用的小数位数。

'int_frac_digits'

货币价值的国际格式化中使用的小数位数。

'mon_thousands_sep'

用于货币值的组分隔符。

'mon_grouping'

相当于“分组”,用于货币价值。

'positive_sign'

用于注释正货币价值的符号。

'negative_sign'

用于注释负面货币价值的符号。

'p_sign_posn / n_sign_posn'

符号的位置(对于正值和负值),见下文。

可以将所有数值设置为CHAR_MAX指示在此语言环境中没有指定值。

对于可能的值'p_sign_posn',并'n_sign_posn'在下面给出。

说明

0

货币和价值被圆括号包围。

1

该符号应该在值和货币符号之前。

2

标志应该遵循价值和货币符号。

3

该符号应该立即在值的前面。

4

该标志应该立即跟随该值。

CHAR_MAX

此区域设置中未指定任何内容。

locale.nl_langinfo(option)

以字符串形式返回一些特定于区域的信息。此功能在所有系统上都不可用,并且可能的选项集也可能因平台而异。可能的参数值是数字,区域设置模块中的符号常量可用。

nl_langinfo()功能接受下列其中一个键。大多数描述取自GNU C库中的相应描述。

locale.CODESET

获取具有所选语言环境中使用的字符编码名称的字符串。

locale.D_T_FMT

获取可用作格式字符串的字符串,以便time.strftime()以特定于语言环境的方式表示日期和时间。

locale.D_FMT

获取可用作格式字符串的字符串,以便time.strftime()以特定于语言环境的方式表示日期。

locale.T_FMT

获取可用作格式字符串的字符串,以便time.strftime()以特定于语言环境的方式表示时间。

locale.T_FMT_AMPM

获取格式字符串time.strftime()以表示am / pm格式的时间。

DAY_1 ... DAY_7

获取一周中第n天的名称。

Note

这遵循美国的DAY_1星期日惯例,而不是国际惯例(ISO 8601),星期一是本周的第一天。

ABDAY_1 ... ABDAY_7

获取一周中第n天的缩写名称。

MON_1 ... MON_12

获取第n个月的名称。

ABMON_1 ... ABMON_12

获取第n个月的缩写名称。

locale.RADIXCHAR

获取基数字符(小数点,小数点逗号等)。

locale.THOUSEP

获取数千个分隔符(三位数组)。

locale.YESEXPR

获取可用于正则表达式的正则表达式,以识别对是/否问题的肯定回答。

注意

该表达式的语法适合regex()C库中的函数,这可能与使用的语法不同re

locale.NOEXPR

获取可用于正则表达式(3)的正则表达式来识别对“是/否”问题的否定响应。

locale.CRNCYSTR

获取货币符号,前面加上“ - ”(如果符号应该出现在值前面),“+”如果符号出现在值后面,或者“。”如果符号应该代替基数字符。

locale.ERA

获取表示当前语言环境中使用的时代的字符串。

大多数语言环境不定义此值。确定这个值的区域设置的一个例子是日本的。在日本,日期的传统表示包括与当时的皇帝统治相对应的时代的名称。

通常不需要直接使用该值。E在其格式字符串中指定修饰符会导致time.strftime()函数使用此信息。没有指定返回字符串的格式,因此您不应该在不同系统上假设它的知识。

locale.ERA_D_T_FMT

获取格式字符串,以便time.strftime()以特定于语言环境的基于时代的方式表示日期和时间。

locale.ERA_D_FMT

获取一个格式字符串,以便time.strftime()以特定于语言环境的基于时代的方式表示日期。

locale.ERA_T_FMT

获取一个格式字符串,以便time.strftime()以特定于语言环境的时代为基础表示时间。

locale.ALT_DIGITS

获取最多100个用于表示值0到99的值的表示。

locale.getdefaultlocale([envvars])

尝试确定默认的区域设置并将它们作为表单的元组返回(language code, encoding)

根据POSIX,一个未setlocale(LC_ALL, '')使用便携式'C'语言环境调用运行的程序。调用setlocale(LC_ALL, '')让它使用由LANG变量定义的默认语言环境。由于我们不想干扰当前的区域设置,因此我们以上述方式模拟了行为。

为了保持与其他平台的兼容性,不仅LANG变量被测试,而且变量列表作为envvars参数给出。第一个被定义的将被使用。envvars默认使用GNU gettext中使用的搜索路径; 它必须始终包含变量名称LANG。GNU的gettext的搜索路径包括'LANGUAGE''LC_ALL''LC_CTYPE',和'LANG',在这个顺序。

除代码外'C',语言代码对应于RFC 1766语言代码编码可能是None如果他们的值不能确定。

2.0版本中的新功能。

locale.getlocale([category])

将给定语言环境类别的当前设置作为包含语言代码编码)的序列返回。类别可能是其中的一个LC_*LC_ALL。它默认为LC_CTYPE

除代码外'C',语言代码对应于RFC 1766语言代码编码可能是None如果他们的值不能确定。

2.0版本中的新功能。

locale.getpreferredencoding([do_setlocale])

根据用户首选项返回用于文本数据的编码。用户首选项在不同的系统上表达方式不同,并且可能在某些系统上以编程方式不可用,所以此函数仅返回猜测。

在某些系统上,需要调用setlocale()以获取用户首选项,所以此函数不是线程安全的。如果调用setlocale不是必需或不需要的,应该将do_setlocale设置为False

2.3版本的新功能。

locale.normalize(localename)

返回给定语言环境名称的规范化语言环境代码。返回的区域设置代码被格式化以供使用setlocale()。如果规范化失败,则原始名称将保持不变。

如果给定的编码未知,则该函数默认为区域设置代码的默认编码setlocale()

2.0版本中的新功能。

locale.resetlocale([category])

类别的区域设置设置为默认设置。

默认设置由调用确定getdefaultlocale()类别默认为LC_ALL

2.0版本中的新功能。

locale.strcoll(string1, string2)

根据当前LC_COLLATE设置比较两个字符串。与其他任何比较函数一样,返回一个负值或一个正值,或者0根据string1string2之前或之后进行整理还是等于它。

locale.strxfrm(string)

将字符串转换为可用于内置函数的字符串cmp(),并且仍返回可识别语言环境的结果。当重复比较相同的字符串时可以使用此函数,例如,在整理一系列字符串时。

locale.format(format, val[, grouping[, monetary]])

格式化的数VAL根据当前LC_NUMERIC设置。格式遵循%运营商的惯例。对于浮点值,小数点在适当的情况下被修改。如果分组是真的,也将分组考虑在内。

如果货币为真,则转换使用货币千位分隔符和分组字符串。

请注意,该函数仅适用于一个%char说明符。对于整个格式字符串,请使用format_string()

版本2.5中更改:添加货币参数。

locale.format_string(format, val[, grouping])

如过程中那样处理格式化说明符format % val,但会考虑当前的语言环境设置。

2.5版本中的新功能。

locale.currency(val[, symbol[, grouping[, international]]])

将数字格式VAL根据当前LC_MONETARY设置。

如果符号为true,则返回的字符串包含货币符号,这是默认值。如果分组为真(这不是默认值),则使用该值完成分组。如果国际是真的(这不是默认),则使用国际货币符号。

请注意,此功能不适用于'C'语言环境,因此您必须首先设置语言环境setlocale()

2.5版本中的新功能。

locale.str(float)

使用与内置函数相同的格式格式化浮点数str(float),但考虑小数点。

locale.atof(string)

按照LC_NUMERIC设置将字符串转换为浮点数。

locale.atoi(string)

按照LC_NUMERIC约定将字符串转换为整数。

locale.LC_CTYPE

用于字符类型函数的语言环境类别。根据这个类别的设置,模块string处理大小写的功能会改变它们的行为。

locale.LC_COLLATE

语言环境类别用于排序字符串。功能strcoll()strxfrm()对的locale模块受到影响。

locale.LC_TIME

区域设置类别用于格式化时间。该功能time.strftime()遵循这些惯例。

locale.LC_MONETARY

用于格式化货币值的区域设置类别。可用的选项可从该localeconv()功能获得。

locale.LC_MESSAGES

用于消息显示的区域设置类别。Python目前不支持应用程序特定的区域识别消息。操作系统显示的消息(如返回的消息)os.strerror()可能会受此类别的影响。

locale.LC_NUMERIC

用于格式化数字的区域设置类别。功能format()atoi()atof()str()的的locale模块是由类的影响。所有其他数字格式化操作不受影响。

locale.LC_ALL

所有区域设置的组合。如果在区域设置更改时使用此标志,则尝试设置所有类别的区域设置。如果任何类别都失败,则根本不会更改类别。使用此标志检索区域设置时,会返回指示所有类别设置的字符串。该字符串可以稍后用于恢复设置。

locale.CHAR_MAX

这是一个用于返回的不同值的符号常量localeconv()

例:

代码语言:javascript
复制
>>> import locale
>>> loc = locale.getlocale()  # get current locale
# use German locale; name might vary with platform
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
>>> locale.strcoll('f\xe4n', 'foo')  # compare a string containing an umlaut
>>> locale.setlocale(locale.LC_ALL, '')   # use user's preferred locale
>>> locale.setlocale(locale.LC_ALL, 'C')  # use default (C) locale
>>> locale.setlocale(locale.LC_ALL, loc)  # restore saved locale

1.背景,细节,提示,提示和警告

C标准将语言环境定义为程序范围的属性,可能相对较昂贵地进行更改。最重要的是,一些实现被破坏,频繁的区域设置更改可能会导致核心转储。这使得语言环境使用起来有点痛苦。

最初,当程序启动时,语言环境是C语言环境,而不管用户的首选语言环境是什么。该程序必须明确表示它希望通过调用用户的首选区域设置setlocale(LC_ALL, '')

调用setlocale()一些库函数通常是一个坏主意,因为它会影响整个程序的副作用。保存和恢复它几乎同样糟糕:它是昂贵的并且会影响在设置恢复之前碰巧运行的其他线程。

如果在为一般用途编码模块时,您需要受区域设置影响的区域设置独立版本(例如string.lower(),或与其一起使用的特定格式time.strftime()),您必须找到一种方法来执行此操作,而不使用标准库例程。更好的是让自己确信使用区域设置是可以的。只有作为最后的手段,你应该证明你的模块与非C本地设置不兼容。

string模块中的大小写转换功能受到语言环境设置的影响。当在一个呼叫setlocale()功能改变LC_CTYPE设置,变量string.lowercasestring.uppercasestring.letters重新计算。请注意,通过' from... import...' 使用这些变量的代码from string import letters不受后续setlocale()调用的影响。

只有这样,才能根据现场执行数字运算是使用由该模块定义的特殊功能:atof()atoi()format()str()

2.对于嵌入Python的扩展编写器和程序

扩展模块不应该调用setlocale(),除非找出当前语言环境。但是由于返回值只能用于便携式恢复它,这不是非常有用(除了可能找出区域是否是C)。

当Python代码使用locale模块更改语言环境时,这也会影响嵌入应用程序。如果嵌入式应用程序不希望发生这种情况,它应该_localeconfig.c文件中的内置模块表中删除扩展模块(完成所有工作),并确保该_locale模块不能作为共享库访问。

3.访问消息目录

locale模块在提供此接口的系统上公开C库的gettext接口。它包括的功能gettext()dgettext()dcgettext()textdomain()bindtextdomain(),和bind_textdomain_codeset()。它们与gettext模块中的相同功能类似,但使用C库的二进制格式用于消息目录,以及C库的搜索算法用于查找消息目录。

Python应用程序通常不需要调用这些函数,而应该使用它gettext。一种已知的例外是用另外的C库在内部调用链接的应用程序gettext()dcgettext()。对于这些应用程序,可能需要绑定文本域,以便这些库可以正确定位其消息目录。

扫码关注腾讯云开发者

领取腾讯云代金券