[Python-de] Codierung von str-Elementen aus os.walk

Peter Otten __peter__ at web.de
Di Aug 7 00:48:38 CEST 2012


vanishxmas at arcor.de wrote:

> Ich möchte gerne einige Dateiennamen in einer Liste speichern, um sie dann
> z.B. tar vor die Füße zu werfen. Nur leider ist das gar nicht so einfach.
> Ich wollte es so machen (ich benutze Python 3):
> 
>> tmpf = tempfile.NamedTemporaryFile(dir="/var/tmp")

root = b"/path/to/my/file"
 
>> for r,ds,fs in os.walk(root):
>>     for fn in fs:
>>         ffn = os.path.join(r,fn)
>>         st = os.lstat(ffn)
>>         if stat.S_ISREG(st.st_mode):
>>             tmpf.write(ffn)
               tmpf.write(b"\n")

> Geht natürlich nicht, weil str nicht das Buffer-Interface unterstützt.
> Nehme ich aber einen Text-Stream zum schreiben, muss ich die ausgegebenen
> Strings codieren. Bei Dateinamen mit Umlauten verfälsche ich so
> theoretisch das Ergebnis, weil UTF-8 nicht eindeutig ist.
> 
> Schlimmer noch: Ich weiß nicht mit Sicherheit, wie meine Dateinamen
> codiert sind. Da sind welche mit latin1, cp1251 und utf-8 dabei. Unter
> Linux stört das ja niemanden, außer, dass man die Namen schlecht anzeigen
> kann. Wenn ich allerdings falsch rate, habe ich einen völlig anderen Namen
> in der Liste stehen.
> 
> Weiß jemand, was man da tun kann?

"""
All functions accepting path or file names accept both bytes and string 
objects, and result in an object of the same type, if a path or file name is 
returned.
"""

os.walk() funktioniert also auch mit bytes. 

(Wenn du sehr pingelig bist, musst du außerdem b"\0" statt b"\n" als 
Trennungsmarkierung verwenden)



Mehr Informationen über die Mailingliste python-de