Wie kann ich aus Teilen (z. B. Pfad zum Ordner, Name und Erweiterung) einen vollständigen Pfad zu einer Datei erstellen?

Lesezeit: 5 Minuten

Benutzeravatar von Damon Julian
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.

Zum Beispiel:

dir_name="/home/me/dev/my_reports"
base_filename="daily_report"
format="pdf"

Ich muss eine Zeichenfolge erstellen '/home/me/dev/my_reports/daily_report.pdf'

Das manuelle Verketten der Teile scheint kein guter Weg zu sein. Ich habe es versucht os.path.join:

join(dir_name,base_filename,format)

aber es gibt

/home/me/dev/my_reports/daily_report/pdf

Benutzeravatar von ʇsәɹoɈ
ʇsәɹoɈ

Das funktioniert gut:

os.path.join(dir_name, base_filename + '.' + filename_suffix)

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:

os.path.join(dir_name, '.'.join((base_filename, filename_suffix)))

Wenn Sie Ihren Code lieber sauber halten möchten, fügen Sie einfach den Punkt in das Suffix ein:

suffix = '.pdf'
os.path.join(dir_name, base_filename + suffix)

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:

suffix = '.pdf'
pathlib.PurePath(dir_name, base_filename + suffix)

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)

    – Shayan Amani

    21. Juni 2019 um 14:54 Uhr


Benutzeravatar von Eugene Yarmash
Eugen Yarmash

In Python 3.4 und höher ist die pathlib Standard-Bibliotheksmodul kann so verwendet werden:

>>> from pathlib import Path
>>> dirname="/home/reports"
>>> filename="daily"
>>> suffix = '.pdf'
>>> Path(dirname, filename).with_suffix(suffix)
PosixPath('/home/reports/daily.pdf')

  • 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).

    – Karl Knechtel

    4. April um 1:50

Benutzeravatar von Mark Longair
Markus Longair

>>> import os
>>> os.path.join(dir_name, base_filename + "." + format)
'/home/me/dev/my_reports/daily_report.pdf'

  • 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

Benutzeravatar von Saltanat Khalyk
Saltanat Khalyk

Warum nicht einfach die Erweiterung in den Basisdateinamen aufnehmen?

dir_name="/home/me/dev/my_reports/"
base_filename="daily_report.pdf"
os.path.join(dir_name, base_filename)

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)

Benutzeravatar von Karl Knechtel
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')

1448660cookie-checkWie kann ich aus Teilen (z. B. Pfad zum Ordner, Name und Erweiterung) einen vollständigen Pfad zu einer Datei erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy