Erstellen Sie den vollständigen Dateinamen des Pfads in Python

Lesezeit: 5 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
ʇ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 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 von 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


Benutzer-Avatar
Eugen Yarmash

Wenn Sie das Glück haben, Python 3.4+ auszuführen, können Sie verwenden pathlib:

>>> 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

Benutzer-Avatar
Markus Longair

Ähm, warum nicht einfach:

>>> 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

Ist es nicht besser, das Format in den Basisdateinamen einzufügen?

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

Benutzer-Avatar
Albert

Benutz einfach os.path.join um Ihren Pfad mit dem Dateinamen und der Erweiterung zu verbinden. Verwenden sys.argv um auf Argumente zuzugreifen, die an das Skript übergeben werden, wenn es ausgeführt wird:

#!/usr/bin/env python3
# coding: utf-8

# import netCDF4 as nc
import numpy as np
import numpy.ma as ma
import csv as csv

import os.path
import sys

basedir="/data/reu_data/soil_moisture/"
suffix = 'nc'


def read_fid(filename):
    fid = nc.MFDataset(filename,'r')
    fid.close()
    return fid

def read_var(file, varname):
    fid = nc.Dataset(file, 'r')
    out = fid.variables[varname][:]
    fid.close()
    return out


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('Please specify a year')

    else:
        filename = os.path.join(basedir, '.'.join((sys.argv[1], suffix)))
        time = read_var(ncf, 'time')
        lat = read_var(ncf, 'lat')
        lon = read_var(ncf, 'lon')
        soil = read_var(ncf, 'soilw')

Führen Sie einfach das Skript wie folgt aus:

   # on windows-based systems
   python script.py year

   # on unix-based systems
   ./script.py year

Benutzer-Avatar
Ravi

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)

1055380cookie-checkErstellen Sie den vollständigen Dateinamen des Pfads in Python

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

Privacy policy