Come dice Mike, è possibile ottenere la codepage del sistema da getfilesystemencoding
. Questa codifica viene utilizzata per convertire le stringhe Unicode native di Windows in byte per tutte le funzioni C stdio utilizzate da Python, comprese le chiamate al file system che utilizzano percorsi di file stringa di byte e os.environ
.
Ciò significa che sarà possibile leggere una stringa con caratteri non ASCII da os.environ
e utilizzarla direttamente come percorso file senza alcun passaggio speciale di codifica/decodifica.
Purtroppo, se la variabile %APPDATA%
contiene caratteri Unicode che non sono presenti nella tabella codici del sistema - per esempio, se in un tedesco (CP1252) installazione di Windows, il percorso è stato C:\Documents and Settings\αβγ\Application Data
- allora quei personaggi avranno già stato storpiato prima avere la possibilità di usarli Decodificare la stringa di byte che si ottiene in Unicode utilizzando il file systemencoding non sarà di aiuto in questo caso.
Ecco una funzione che è possibile utilizzare sulle recenti versioni di Python che hanno l'estensione ctypes
, per leggere le variabili di ambiente Unicode native di Windows.
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, il dizionario os.environ
contiene stringhe Unicode prese direttamente da Windows, senza la codifica codepage, in modo da non dovete preoccuparvi di questo problema.
Ciao, grazie bobince per la risposta. In questo modo ottengo il percorso Appdata corretto, ma non risolve il problema con le dieresi. Non riesco a trovare un modo per decodificare la stringa unicode da buf.value nel modo giusto. – Heike
'buf.value' è già una stringa Unicode. Non è necessario decodificarlo. È possibile utilizzare le stringhe Unicode direttamente come nomi di file su Windows in Python 2.3 in poi (PEP277). – bobince
ma os.path.exist (buf.value) restituisce false ... se provo con un nome senza dieresi funziona – Heike