it-swarm.com.de

Erstellen Sie den vollständigen Pfadnamen in Python

Ich muss einem Modul einen Dateipfadnamen übergeben. Wie erstelle ich den Dateipfad aus einem Verzeichnisnamen, einem Basisdateinamen und einer Zeichenfolge im Dateiformat?

Das Verzeichnis kann zum Zeitpunkt des Aufrufs vorhanden sein oder nicht.

Zum Beispiel:

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

Ich muss einen String erstellen '/home/me/dev/my_reports/daily_report.pdf'

Manuelles 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
153
Damon Julian

Das funktioniert gut:

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

Denken Sie daran, dass os.path.join() nur existiert, weil unterschiedliche Betriebssysteme unterschiedliche Pfadtrennzeichen verwenden. Dieser Unterschied wird ausgeglichen, sodass plattformübergreifender Code nicht mit Sonderfällen für jedes Betriebssystem überfrachtet werden muss. Dies ist für Dateinamenerweiterungen (siehe Fußnote) nicht erforderlich, da diese auf jedem Betriebssystem immer mit einem Punkt mit dem Rest des Namens verbunden sind.

Wenn Sie sich mit einer Funktion trotzdem besser fühlen (und Ihren Code unnötig komplizieren möchten), können Sie dies 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)

Fußnote: Unter Nicht-Micorsoft-Betriebssystemen gibt es keine Dateinamenerweiterung. Seine Präsenz unter Windows kommt von MS-DOS und FAT, die es von CP/M ausgeliehen haben, das seit Jahrzehnten tot ist. Diese Punkt-plus-Drei-Buchstaben, die viele von uns zu sehen gewohnt sind, sind nur ein Teil des Dateinamens auf jedem anderen modernen Betriebssystem, auf dem es keine eingebaute Bedeutung hat.

236
ʇsәɹoɈ

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

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

Warum nicht einfach:

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

Benutz einfach os.path.join um deinen Pfad mit dem Dateinamen und der Endung zu verbinden. Verwenden sys.argv um auf Argumente zuzugreifen, die beim Ausführen an das Skript übergeben werden:

#!/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 __== '__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 das Skript einfach wie folgt aus:

   # on windows-based systems
   python script.py year

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