Ein weiteres Problem, das in den anderen Kommentaren noch nicht angesprochen wurde, ist der leere String, der offensichtlich kein gültiger Dateiname ist. Sie können auch einen leeren String erhalten, wenn Sie zu viele Zeichen entfernen.
Was die Windows-reservierten Dateinamen und Probleme mit Punkten betrifft, ist die sicherste Antwort auf die Frage "Wie normalisiere ich einen gültigen Dateinamen aus beliebiger Benutzereingabe?" "Versuchen Sie es erst gar nicht": Wenn Sie einen anderen Weg finden können, um dies zu vermeiden (z. B. die Verwendung von Ganzzahl-Primärschlüsseln aus einer Datenbank als Dateinamen), tun Sie das.
Wenn Sie müssen und wirklich Leerzeichen und '.' für Dateierweiterungen als Teil des Namens zulassen müssen, versuchen Sie etwas Ähnliches wie:
import re
badchars= re.compile(r'[^A-Za-z0-9_. ]+|^\.|\.$|^ | $|^$')
badnames= re.compile(r'(aux|com[1-9]|con|lpt[1-9]|prn)(\.|$)')
def makeName(s):
name= badchars.sub('_', s)
if badnames.match(name):
name= '_'+name
return name
Selbst dies kann nicht garantiert richtig sein, insbesondere auf unerwarteten Betriebssystemen — zum Beispiel hasst RISC OS Leerzeichen und verwendet '.' als Verzeichnistrennzeichen.
35 Stimmen
Sollte dies nicht in das os.path-Modul integriert sein?
5 Stimmen
Vielleicht, obwohl ihr Anwendungsfall einen einzigen sicheren Pfad über alle Plattformen erfordern würde, nicht nur die aktuelle, wofür das Betriebssystem nicht konzipiert ist, um damit umzugehen.
6 Stimmen
Um den obigen Kommentar zu erweitern: Das aktuelle Design von
os.path
lädt tatsächlich je nach Betriebssystem eine andere Bibliothek (siehe die zweite Notiz in der Dokumentation). Wenn eine Quoting-Funktion inos.path
implementiert wäre, könnte sie nur das Zeichenfolge für POSIX-Sicherheit quoten, wenn sie auf einem POSIX-System ausgeführt wird, oder für Windows-Sicherheit, wenn sie auf Windows ausgeführt wird. Der resultierende Dateiname wäre nicht unbedingt gültig für sowohl Windows als auch POSIX, was die Frage verlangt.0 Stimmen
Es ist einfach genug, die
Pfad
-Funktionen für ein anderes Betriebssystem zu verwenden. Verwenden Sie beispielsweise auf Uniximport ntpath; ntpath.abspath("a.txt")
, um den absoluten Pfad einer Datei in einem (hypothetischen) Windows-Dateisystem zu erhalten. Oder verwenden Sieposixpath
für POSIX-Systeme (Linux, Mac OS).