454 Stimmen

Umwandeln Sie eine Zeichenfolge in einen gültigen Dateinamen?

Ich habe einen String, den ich als Dateinamen verwenden möchte, daher möchte ich alle Zeichen entfernen, die in Dateinamen nicht erlaubt wären, mit Python.

Ich wäre lieber streng als nachlässig, also möchte ich nur Buchstaben, Zahlen und eine kleine Menge anderer Zeichen wie "_-.() " behalten. Was ist die eleganteste Lösung?

Der Dateiname muss auf mehreren Betriebssystemen gültig sein (Windows, Linux und Mac OS) - es handelt sich um eine MP3-Datei in meiner Bibliothek mit dem Songtitel als Dateiname und wird zwischen 3 Maschinen gemeinsam genutzt und gesichert.

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 in os.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.

0voto

wires Punkte 4648

UPDATE

Alle Links in dieser 6 Jahre alten Antwort sind irreparabel kaputt.

Außerdem würde ich es heute nicht mehr so machen, einfach base64 codieren oder unsichere Zeichen entfernen. Beispiel in Python 3:

import re
t = re.compile("[a-zA-Z0-9.,_-]")
unsafe = "abcéø"
safe = [ch for ch in unsafe if t.match(ch)]
# => 'abc'

Mit base64 kannst du kodieren und dekodieren, sodass du den Originaldateinamen wiederherstellen kannst.

Je nach Anwendungsfall ist es möglicherweise besser, einen zufälligen Dateinamen zu generieren und die Metadaten in einer separaten Datei oder Datenbank zu speichern.

from random import choice
from string import ascii_lowercase, ascii_uppercase, digits
allowed_chr = ascii_lowercase + ascii_uppercase + digits

safe = ''.join([choice(allowed_chr) for _ in range(16)])
# => 'CYQ4JDKE9JfcRzAZ'

URSPRÜNGLICHE LINKROTTEN ANTWORT:

Das bobcat-Projekt enthält ein Python-Modul, das genau das macht.

Es ist nicht vollständig robust, siehe diesen Beitrag und diese Antwort.

Also, wie bereits erwähnt: base64-Codierung ist wahrscheinlich eine bessere Idee, wenn die Lesbarkeit nicht wichtig ist.

0 Stimmen

Alle Links sind tot. Mann, tu etwas.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X