web-dev-qa-db-fra.com

Quelle est la bonne façon de définir les paramètres régionaux de Python sous Windows?

J'essaie de trier une liste de chaînes de manière adaptée aux paramètres régionaux. J'ai utilisé la bibliothèque Babel pour d'autres tâches liées à i18n, mais elle ne prend pas en charge le tri. Le module locale de Python fournit une fonction strcoll, mais nécessite que les paramètres régionaux du processus soient définis sur celui avec lequel je veux travailler. Une sorte de douleur, mais je peux vivre avec.

Le problème est que je n'arrive pas à définir réellement les paramètres régionaux. La documentation du module locale donne cet exemple:

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')

Quand je lance ça, j'obtiens ceci:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\Lib\locale.py", line 494, in setlocale
locale.Error: unsupported locale setting

Qu'est-ce que je fais mal?

75
DNS

Il semble que vous utilisiez Windows. Les chaînes de paramètres régionaux y sont différentes. Jetez un oeil plus précis sur le doc:

locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform

Sous Windows, je pense que ce serait quelque chose comme:

locale.setlocale(locale.LC_ALL, 'deu_deu')

MSDN a une liste de chaînes de langue et de chaînes de pays/région

101
Schnouki

Vous devez ne pas passer de locale explicite à setlocale, c'est faux. Laissez-le découvrir de l'environnement. Vous devez lui passer une chaîne vide

import locale
locale.setlocale(locale.LC_ALL, '')
13
u0b34a0f6ae

C'est la seule façon de le faire sous Windows (exemple pour les paramètres régionaux allemands):

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German")  # Not locale="de_DE"
11
Boštjan Mejak

Je sais que cela a été demandé il y a des années, mais je pensais que j'essaierais d'ajouter ce que j'ai découvert, en utilisant Python 3.6 sous Windows:

import locale
for x in locale.windows_locale.values():
    print(x.replace('_','-'))

J'en ai essayé et cela semble aussi être un moyen de découvrir ce qui est disponible sur Windows.

Bon à savoir: pour une raison quelconque, ce n'est pas compatible avec strptime () dans la version stable actuelle de Python

Et puis vous définissez simplement les paramètres régionaux:

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)

6
DelphiGeekGuy

Ubuntu

Sur Ubuntu, vous pouvez avoir ce problème car vous n'avez pas installé ce local sur votre système.

Depuis Shell, essayez:

$> locale -a

et vérifiez si vous trouvez les paramètres régionaux qui vous intéressent. Sinon, vous devez l'installer:

$> Sudo apt-get install language-pack-XXX

où XXX est votre langue (dans mon cas "xxx = it", paramètres régionaux italiens) Exécutez ensuite un dpkg-reconfigure:

$> Sudo dpkg-reconfigure locales

Après cela, essayez à nouveau dans votre python Shell:

>>> import locale
>>> locale.setlocale(locale.LC_ALL,'it_IT.UTF-8')

(c'est pour les paramètres régionaux italiens, ce dont j'avais besoin)

6
linello

Depuis les documents locale.setlocale:

locale.setlocale(category, locale=None):
    """
    Set the locale for the given category.  The locale can be
    a string, an iterable of two strings (language code and encoding),
    or None.
    """"

Sous Linux (en particulier Ubuntu), vous pouvez soit utiliser

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')

ou

locale.setlocale(locale.LC_ALL, ('de', 'utf-8'))

Vous obtiendrez la même erreur si l'environnement local est non installé sur le système. Donc, assurez-vous d'avoir les paramètres régionaux installés sur votre système:

$ locale -a # to list the currently installed locales
$ (Sudo) locale-gen de_DE.UTF-8 # to install new locale
3
Alexander Stefanov