Wie kann man das Gebietsschema von Python unter Windows richtig einstellen?

80

Ich versuche, eine Liste von Zeichenfolgen nach Gebietsschema zu sortieren. Ich habe die Babel-Bibliothek für andere i18n-bezogene Aufgaben verwendet, sie unterstützt jedoch keine Sortierung. Das Python- localeModul bietet eine strcollFunktion, erfordert jedoch, dass das Gebietsschema des Prozesses auf das Gebietsschema festgelegt wird, mit dem ich arbeiten möchte. Eine Art Schmerz, aber ich kann damit leben.

Das Problem ist, dass ich das Gebietsschema nicht wirklich festlegen kann. Die Dokumentation für das localeModul enthält das folgende Beispiel:

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

Wenn ich das laufen lasse, bekomme ich folgendes:

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

Was mache ich falsch?

DNS
quelle

Antworten:

109

Anscheinend verwenden Sie Windows. Die Gebietsschema-Zeichenfolgen sind dort unterschiedlich. Schauen Sie sich das Dokument genauer an:

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

Unter Windows denke ich, wäre es so etwas wie:

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

MSDN enthält eine Liste von Sprachzeichenfolgen und Länder- / Regionszeichenfolgen

Schnouki
quelle
5
FWIW, hatte ich das Problem unter Ubuntu 13.04, Linux 3.8.0-19mit Python 2.7.4beim Versuch , das Gebietsschema festgelegt fr_FR. Das Einstellen hat fr_FR.UTF-8für mich funktioniert.
Zoneur
Für Python 3.6.3 in Conda 4.4.11, Windows 7, scheinen die Gebietsschemazeichenfolgen mit denen anderer Betriebssysteme identisch zu sein.
Srodriguex
2
Diese Liste ist umfassender: msdn.microsoft.com/en-us/library/cc233982.aspx
Cristian Ciupitu
2
Die verknüpften Dokumente scheinen zu neu für WServer2018R2 zu sein, die ich verwenden musste 'eng_usa'( 'en_US'funktionierte nicht)
Boop
17

Dies ist die einzig richtige Verwendung, um ein Beispiel für das deutsche Gebietsschema zu liefern:

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German"  # Note: do not use "de_DE" as it doesn't work)
Boštjan Mejak
quelle
1
Dies ist die einzige Antwort, die die Frage tatsächlich beantwortet.
ImportanceOfBeingErnest
Das half mir, aber ich hatte zu ändern Germanzu Portuguese_Brazil.1252. Kennen Sie eine Dokumentation, in der diese Werte aufgeführt sind?
Henrique Brisola
14

Sie sollten ein explizites Gebietsschema nicht an setlocale übergeben, es ist falsch. Lassen Sie es aus der Umwelt herausfinden. Sie müssen ihm eine leere Zeichenfolge übergeben

import locale
locale.setlocale(locale.LC_ALL, '')
u0b34a0f6ae
quelle
10
Ich habe dies in der Frage nicht erwähnt, da es nicht direkt damit zusammenhängt, aber der Code, den ich damals schrieb, wurde für die Verwendung auf einem Webserver entwickelt. Mit anderen Worten, das Gebietsschema kann sich mit jeder Anforderung ändern und ist nicht unbedingt immer mit dem Gebietsschema der Umgebung identisch.
DNS
2
DNS: Haben Sie die Dokumente für das Gebietsschema gelesen? Dies impliziert, dass es gefährlich sein kann, setlocale "viel" zu nennen, und es ist nicht threadsicher. Vielleicht ist etwas anderes als setlocale die Lösung. Gettext kann beispielsweise verschiedene Kataloge laden und zur Laufzeit wechseln. aber ich weiß nicht, wofür Sie das Gebietsschema verwenden.
u0b34a0f6ae
Es sei denn, Ihr Benutzer befindet sich nicht auf Ihrem lokalen Computer
Gabriel
8

Ubuntu

Unter Ubuntu kann dieses Problem auftreten, da Sie dieses lokale System nicht auf Ihrem System installiert haben.

Aus der Shell versuchen Sie Folgendes:

$> locale -a

und prüfen Sie, ob Sie das Gebietsschema finden, an dem Sie interessiert sind. Andernfalls müssen Sie es installieren:

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

Dabei ist XXX Ihre Sprache (in meinem Fall "xxx = it", italienisches Gebietsschema). Führen Sie dann Folgendes aus dpkg-reconfigure:

$> sudo dpkg-reconfigure locales

Versuchen Sie es danach erneut in Ihrer Python-Shell:

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

(Dies ist für italienisches Gebietsschema, was ich brauchte)

Linello
quelle
13
Diese Frage fragt speziell nach Windows
Christoph
7

Ich weiß, dass dies vor Jahren gefragt wurde, aber ich dachte, ich würde versuchen, das, was ich herausgefunden habe, mit Python 3.6 unter Windows hinzuzufügen:

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

Ich habe einige ausprobiert und das scheint auch eine Möglichkeit zu sein, herauszufinden, was unter Windows verfügbar ist.

Gut zu wissen: Dies ist aus irgendeinem Grund nicht mit strptime () in der aktuellen stabilen Version von Python kompatibel

Und dann legen Sie einfach das Gebietsschema fest:

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)

TheGeekGuy
quelle
4

Aus locale.setlocale-Dokumenten:

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.
    """"

Unter Linux (insbesondere Ubuntu) können Sie entweder verwenden

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

oder

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

Sie erhalten den gleichen Fehler, wenn das Gebietsschema nicht auf dem System installiert ist. Stellen Sie also sicher, dass Sie das Gebietsschema auf Ihrem System installiert haben :

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