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
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.
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')
Euh, pourquoi ne pas simplement:
>>>> import os
>>>> os.path.join(dir_name, base_filename + "." + format)
'/home/me/dev/my_reports/daily_report.pdf'
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
_