web-dev-qa-db-fra.com

Construisez le chemin complet du nom de fichier dans Python

Je dois passer un nom de chemin de fichier à un module. Comment puis-je construire le chemin du fichier à partir d'un nom de répertoire, d'un nom de fichier de base et d'une chaîne de format de fichier?

Le répertoire peut exister ou non au moment de l'appel.

Par exemple:

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

J'ai besoin de créer une chaîne '/home/me/dev/my_reports/daily_report.pdf'

Concaténer les morceaux manuellement ne semble pas être un bon moyen. J'ai essayé os.path.join:

join(dir_name,base_filename,format)

mais ça donne

/home/me/dev/my_reports/daily_report/pdf
153
Damon Julian

Cela fonctionne bien:

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

Gardez à l'esprit que os.path.join() n'existe que parce que différents systèmes d'exploitation utilisent des caractères de séparation de chemin différents. Cela adoucit cette différence, évitant ainsi de surcharger le code multiplateforme de cas particuliers pour chaque système d'exploitation. Il n'est pas nécessaire de faire cela pour les "extensions" de noms de fichiers (voir note de bas de page) car elles sont toujours connectées au reste du nom avec un caractère de point, sur chaque système d'exploitation.

Si vous utilisez quand même une fonction pour vous sentir mieux (et que vous aimez compliquer inutilement votre code), vous pouvez le faire:

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

Si vous préférez garder votre code propre, incluez simplement le point dans le suffixe:

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

Note de bas de page: Il n’existe pas de nom de fichier "extension" sur les systèmes d’exploitation autres que Micorsoft. Sa présence sur Windows provient de MS-DOS et de FAT, qui l’ont emprunté à CP/M, mort depuis des décennies. Ce point plus trois lettres que beaucoup d’entre nous sommes habitués à voir n’est qu’une partie du nom de fichier de tout autre système d’exploitation moderne, où il n’a pas de signification intrinsèque.

236
ʇsәɹoɈ

Si vous avez la chance d'exécuter Python 3.4+, vous pouvez utiliser pathlib :

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

Euh, pourquoi ne pas simplement:

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

Utilisez simplement os.path.join pour joindre votre chemin avec le nom de fichier et l’extension. Utilisez sys.argv pour accéder aux arguments transmis au script lors de son exécution:

_#!/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')
_

Il suffit de lancer le script comme suit:

_   # on windows-based systems
   python script.py year

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