Wie kann ich aus Teilen (z. B. Pfad zum Ordner, Name und Erweiterung) einen vollständigen Pfad zu einer Datei erstellen?
Lesezeit: 5 Minuten
Damian Julian
Ich muss einen Dateipfadnamen an ein Modul übergeben. Wie erstelle ich den Dateipfad aus einem Verzeichnisnamen, einem Basisdateinamen und einer Dateiformatzeichenfolge?
Das Verzeichnis kann zum Zeitpunkt des Anrufs existieren oder nicht.
Denk daran, dass os.path.join() existiert nur, weil verschiedene Betriebssysteme unterschiedliche Pfadtrennzeichen verwenden. Es gleicht diesen Unterschied aus, sodass plattformübergreifender Code nicht mit Sonderfällen für jedes Betriebssystem überladen werden muss. Für Dateinamen-“Erweiterungen” (siehe Fußnote) ist dies nicht erforderlich, da ihnen auf jedem Betriebssystem, das sie implementiert, immer ein Punkt vorangestellt wird.
Wenn Sie sich trotzdem besser fühlen, wenn Sie eine Funktion verwenden (und Sie Ihren Code gerne unnötig komplizieren), können Sie Folgendes tun:
Dieser Ansatz ist auch mit den Suffixkonventionen in kompatibel pathlib, das einige Jahre nach dieser Frage in Python 3.4 eingeführt wurde. Neuer Code, der keine Abwärtskompatibilität erfordert, kann dies tun:
Sie könnten versucht sein, die kürzere zu verwenden Path() anstatt PurePath() wenn Sie nur Pfade für das lokale Betriebssystem handhaben. Ich würde diese Wahl angesichts der plattformübergreifenden Probleme hinter der ursprünglichen Frage in Frage stellen.
Warnung: Verwenden Sie keine Pathlibs with_suffix() für diesen Zweck. Diese Methode wird beschädigt base_filename wenn es jemals einen Punkt enthält.
Fußnote: Außerhalb von Microsoft-Betriebssystemen gibt es keine Dateinamen-“Erweiterung”. Seine Präsenz unter Windows stammt von MS-DOS und FAT, die es von CP/M ausgeliehen haben, das seit Jahrzehnten tot ist. Dieser Punkt-plus-drei-Buchstaben, an den viele von uns gewöhnt sind, ist nur ein Teil des Dateinamens auf jedem anderen modernen Betriebssystem, wo er keine eingebaute Bedeutung hat.
Sie haben erwähnt, dass das Trennzeichen des Betriebssystems möglicherweise nicht vorhanden ist .. Dafür kann man verwenden os.extsep.
– sjbx
18. März 2013 um 14:25 Uhr
Ich habe nichts dergleichen erwähnt.
– ʇsәɹoɈ
11. Juni 2013 um 21:35 Uhr
Sie haben sich einige Mühe gegeben, um zu erklären, dass “Dateinamen-“Erweiterungen” nur auf einem großen Betriebssystem eine signifikante Bedeutung haben (sie sind einfach Teil des Dateinamens auf Nicht-Windows-Systemen) und ihr Trennzeichen immer ein Punkt ist”. Das OP drückte auch aus, dass es am Ende /pdf gesehen habe. Du hättest es also tun können os.path.join(dir_name, base_filename, os.extsep, extension). Ihre Antwort ist vollkommen richtig.
– sjbx
12. Juni 2013 um 14:00 Uhr
Ja, du hast recht, es gibt nur einen String zurück, also os.path.join(dir_name, ”.join([base_filename, os.extsep, extension])) Sollte es tun. Auch hier wird die Richtigkeit Ihrer Antwort nicht untergraben.
– sjbx
14. Juni 2013 um 8:09 Uhr
@sjbx solltest du setzen + zwischen Dateinamenteilen. os.path.join() fügt betriebssystemspezifische Pfadtrennzeichen hinzu (/ zum Beispiel) zwischen den Argumenten (da @sәɹoɈ sie korrekt in seiner/ihrer Antwort hat. Daher lautet die korrekte Form Ihres Code-Snippets: os.path.join(dir_name, base_filename + os.extsep + extension)
Ich finde pathlib viel eleganter als os.path.join, das im Vergleich ziemlich klobig erscheint.
– Pionier
6. Mai 2019 um 20:35 Uhr
Funktioniert nicht, wenn Ihr Dateiname ein “.” >>>filename2= ‘daily.hourly’ >>>Path(dirname, filename2).with_suffix(suffix) Output:WindowsPath(‘/home/reports/daily.pdf’)
– Wontleave
28. Juni 2019 um 6:27 Uhr
@wontleave: Wenn ein Dateiname bereits ein Suffix hat, with_suffix() wird es ersetzen, anstatt es anzuhängen. Sie wollen so etwas wie Path(dirname, filename2 + suffix)
– Eugen Yarmash
28. Juni 2019 um 8:46 Uhr
pathlib bietet auch eine clevere Operatorüberladung: (Path(dirname) / filename).with_suffix(suffix).
danke, aber ich hatte gehofft, dass es eine sauberere Möglichkeit gibt, diese Erweiterung anzuhängen. Python hat sogar eine Splitext-Funktion, um die Erweiterung abzuschneiden. Also muss es etwas geben, um das Gegenteil zu tun
– Damian Julian
20. August 2011 um 16:16 Uhr
Die Splittext-Funktion behält das ‘.’ an der Vorderseite der Erweiterung. Dies ist wahrscheinlich die sauberste Methode. Wenn Sie möchten, dass es in Ihrem Code sauberer aussieht, würde ich vorschlagen, eine Funktion oder eine Lambda-Funktion zu verwenden.
– Vorticity
20. August 2011 um 21:19 Uhr
Saltanat Khalyk
Warum nicht einfach die Erweiterung in den Basisdateinamen aufnehmen?
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATE_PATH = Path.joinpath(BASE_DIR,"templates")
print(TEMPLATE_PATH)
Karl Knechtel
import os
def createfile(name, location, extension):
print(name, extension, location)
#starting creating a file with some dummy contents
path = os.path.join(location, name + '.' + extension)
f = open(path, "a")
f.write("Your contents!! or whatever you want to put inside this file.")
f.close()
print("File creation is successful!!")
def readfile(name, location, extension):
#open and read the file after the appending:
path = os.path.join(location, name + '.' + extension)
f = open(path, "r")
print(f.read())
#pass the parameters here
createfile('test','./','txt')
readfile('test','./','txt')
14486600cookie-checkWie kann ich aus Teilen (z. B. Pfad zum Ordner, Name und Erweiterung) einen vollständigen Pfad zu einer Datei erstellen?yes