Wie Mike sagt, können Sie die System-Codepage von getfilesystemencoding
erhalten. Diese Codierung wird verwendet, um die nativen Unicode-Strings von Windows für alle von Python verwendeten C stdio-Funktionen in Byte umzuwandeln, einschließlich der Dateisystemaufrufe, die Byte-Zeichenketten-Dateipfade verwenden, und os.environ
.
Dies bedeutet, dass Sie eine Zeichenfolge mit Nicht-ASCII-Zeichen von os.environ
lesen und direkt als Dateipfad ohne einen speziellen Codierungs-/Decodierschritt verwenden können.
Leider, wenn die %APPDATA%
Variable Unicode-Zeichen enthält, die nicht in der System-Codepage ist - zum Beispiel, wenn auf einem deutschen (cp1252) Windows installieren, Ihr Weg C:\Documents and Settings\αβγ\Application Data
war - dann werden diese Zeichen schon, bevor Sie verstümmelt worden nutzen Sie die Chance, sie zu nutzen. Das Dekodieren der Bytezeichenfolge, die Sie mit Unicode mithilfe der Dateisystem-Codierung erhalten, wird in diesem Fall nicht helfen.
Hier ist eine Funktion, die Sie in aktuellen Python-Versionen mit der Erweiterung ctypes
verwenden können, um native Unicode-Umgebungsvariablen von Windows zu lesen.
def getEnvironmentVariable(name):
name= unicode(name) # make sure string argument is unicode
n= ctypes.windll.kernel32.GetEnvironmentVariableW(name, None, 0)
if n==0:
return None
buf= ctypes.create_unicode_buffer(u'\0'*n)
ctypes.windll.kernel32.GetEnvironmentVariableW(name, buf, n)
return buf.value
In Python 3, das os.environ
Wörterbuch enthält Unicode-Strings direkt aus dem Windows ohne Codepage Codierung genommen, so dass Sie es sich nicht um dieses Problem zu kümmern.
Hallo, Dank Bobince für Ihre Antwort. Auf diese Weise bekomme ich den richtigen Appdata-Pfad, aber das Problem mit den Umlauten wird nicht gelöst. Ich kann keinen Weg finden, die Unicode-Zeichenkette richtig von buf.value zu entschlüsseln. – Heike
'buf.value' ist bereits eine Unicode-Zeichenfolge. Sie müssen es nicht entschlüsseln. Sie können Unicode-Zeichenfolgen direkt als Dateinamen unter Windows ab Python 2.3 (PEP277) verwenden. – bobince
aber os.path.exist (buf.value) gibt false zurück ... Wenn ich es mit einem Namen ohne Umlaute versuche funktioniert es – Heike