Sie können sich das Django Framework ansehen (aber beachten Sie deren Lizenz!), wie sie aus beliebigem Text einen "Slug" erstellen. Ein Slug ist URL- und Dateinamen-freundlich.
Die Django-Text-Utilities definieren eine Funktion, slugify()
, die wahrscheinlich der Goldstandard für diese Art von Dingen ist. Im Wesentlichen sieht ihr Code wie folgt aus.
import unicodedata
import re
def slugify(value, allow_unicode=False):
"""
Übernommen von https://github.com/django/django/blob/master/django/utils/text.py
Konvertiert in ASCII, wenn 'allow_unicode' False ist. Konvertiert Leerzeichen oder wiederholte Bindestriche in einzelne Bindestriche. Entfernt Zeichen, die keine alphanumerischen Zeichen, Unterstriche oder Bindestriche sind. Konvertiert in Kleinbuchstaben. Entfernt auch führende und abschließende Leerzeichen, Bindestriche und Unterstriche.
"""
value = str(value)
if allow_unicode:
value = unicodedata.normalize('NFKC', value)
else:
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
value = re.sub(r'[^\w\s-]', '', value.lower())
return re.sub(r'[-\s]+', '-', value).strip('-_')
Und die ältere Version:
def slugify(value):
"""
Normalisiert den String, konvertiert in Kleinbuchstaben, entfernt nicht-alfa-Zeichen und konvertiert Leerzeichen in Bindestriche.
"""
import unicodedata
value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
value = unicode(re.sub('[-\s]+', '-', value))
# ...
return value
Es gibt noch mehr, aber ich habe es ausgelassen, da es nicht die Slug-Erstellung behandelt, sondern das Escapen.
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).