Erstellen Sie den vollständigen Dateinamen des Pfads in Python
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 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 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
Eugen Yarmash
Wenn Sie das Glück haben, Python 3.4+ auszuführen, können Sie verwenden pathlib:
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)
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?
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
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)
10553800cookie-checkErstellen Sie den vollständigen Dateinamen des Pfads in Pythonyes