Ich weiß, dass es viele Antworten gibt, aber sie beruhen meistens auf regulären Ausdrücken oder externen Modulen, daher möchte ich meine eigene Antwort einbringen. Eine reine Python-Funktion, kein externes Modul erforderlich, kein regulärer Ausdruck verwendet. Mein Ansatz besteht nicht darin, ungültige Zeichen zu bereinigen, sondern nur gültige zuzulassen.
def normalizefilename(fn):
validchars = "-_.() "
out = ""
for c in fn:
if str.isalpha(c) or str.isdigit(c) or (c in validchars):
out += c
else:
out += "_"
return out
Wenn Sie möchten, können Sie Ihre eigenen gültigen Zeichen zur validchars
-Variablen am Anfang hinzufügen, wie z.B. Ihre nationalen Buchstaben, die im englischen Alphabet nicht existieren. Das ist etwas, was Sie vielleicht wollen oder auch nicht wollen: Einige Dateisysteme, die nicht auf UTF-8 basieren, könnten immer noch Probleme mit nicht-ASCII-Zeichen haben.
Diese Funktion dient dazu, die Gültigkeit eines einzelnen Dateinamens zu testen. Sie wird die Pfadtrennzeichen durch _ ersetzen, da sie sie als ungültige Zeichen betrachtet. Wenn Sie das hinzufügen möchten, ist es einfach, das if
zu ändern, um den Betriebssystem-Pfadseparator einzuschließen.
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).