Mi piacerebbe davvero che la mia applicazione Python venisse trattata esclusivamente con stringhe Unicode internamente. Ultimamente questo è andato bene per me, ma ho riscontrato un problema con i percorsi di gestione. L'API POSIX per i filesystem non è Unicode, quindi è possibile (e in realtà un po 'comune) che i file abbiano nomi "non codificabili": nomi di file che non sono codificati nella codifica dichiarata del file system.Come gestire nomi di file indecifrabili in Python?
In Python, questo si manifesta come una miscela di unicode
e str
oggetti restituiti da os.listdir()
.
>>> os.listdir(u'/path/to/foo')
[u'bar', 'b\xe1z']
In questo esempio, il carattere '\xe1'
è codificato in latino-1 o somesuch, anche quando la (ipotetica) file system riporta sys.getfilesystemencoding() == 'UTF-8'
(UTF-8, che carattere sarebbero i due byte '\xc3\xa1'
). Per questo motivo, otterrai UnicodeError
dappertutto se si tenta di utilizzare, ad esempio, os.path.join()
con percorsi Unicode, poiché il nome file non può essere decodificato.
Il Python Unicode HOWTO offre questo consigli su percorsi unicode:
Nota che nella maggior parte delle occasioni, le API Unicode dovrebbe essere usato. Le API dei byte dovrebbero essere utilizzate solo su sistemi in cui possono essere presenti nomi di file non decodificabili, ad esempio i sistemi Unix.
Poiché mi interessa principalmente i sistemi Unix, significa che dovrei ristrutturare il mio programma per gestire solo i bytestrings per i percorsi? (In tal caso, come posso mantenere la compatibilità con Windows?) O ci sono altri modi migliori per gestire nomi di file non codificabili? Sono abbastanza rari "in the wild" che dovrei solo chiedere agli utenti di rinominare i loro dannati file?
(Se è meglio trattare solo con le stringhe di byte internamente, Ho una domanda followup:? Come faccio a memorizzare stringhe di byte in SQLite per una colonna, mantenendo il resto dei dati di stringhe Unicode come amichevoli)
Grazie! Non sapevo di questo PEP. È una soluzione abbastanza intelligente. – adrian