construyendo el nombre de archivo de ruta completa en python,
Necesito pasar un nombre de ruta de archivo a un módulo que crea un documento de informe como pdf, html, etc.¿Cómo compilo el nombre de la ruta del archivo a partir de un nombre de directorio,un nombre de archivo base y una cadena de formato de archivo ?
El directorio puede o no existir en el momento de la llamada
Por ejemplo
dir_name='/home/me/dev/my_reports'
base_filename='daily_report'
format = 'pdf'
Necesito crear una cadena '/home/me/dev/my_reports/daily_report.pdf'
Concatenar las piezas manualmente no parecía ser una buena manera. Probé con os.camino.unirse
join(dir_name,base_filename,format)
, Pero da
'/home/me/dev/my_reports/daily_report/pdf'
4 answers
Esto funciona bien:
os.path.join(dir_name, base_filename + "." + filename_suffix)
Tenga en cuenta que os.path.join()
existe solo porque diferentes sistemas operativos usan diferentes caracteres separadores de ruta. Suaviza esa diferencia para que el código multiplataforma no tenga que estar lleno de casos especiales para cada sistema operativo. No hay necesidad de hacer esto para las "extensiones" de nombre de archivo (ver nota al pie), porque siempre están separadas del resto del nombre por el mismo carácter de punto, en cada sistema operativo.
Si usar una función de todos modos te hace sentir mejor (y te gusta complicar innecesariamente tu código), puedes hacer esto:
os.path.join(dir_name, '.'.join((base_filename, filename_suffix)))
Si prefiere mantener su código limpio, simplemente incluya el punto en el sufijo:
suffix = '.pdf'
os.path.join(dir_name, base_filename + suffix)
Nota al pie: No hay tal cosa como un nombre de archivo "extensión" en los sistemas operativos que no son Micorsoft. Su presencia en Windows proviene de MS-DOS y FAT, que lo tomaron prestado de CP/M, que ha estado muerto durante décadas. Ese punto más tres letras que muchos de nosotros estamos acostumbrados a ver es solo parte del archivo nombre en cualquier otro sistema operativo moderno, donde no tiene un significado incorporado.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-14 20:39:12
Um, ¿por qué no solo:
>>>> import os
>>>> os.path.join(dir_name, base_filename + "." + format)
'/home/me/dev/my_reports/daily_report.pdf'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-22 10:01:55
Si tiene la suerte de estar ejecutando Python 3.4+, puede utilizar pathlib
:
>>> from pathlib import Path
>>> dirname = "/home/reports"
>>> filename = "daily"
>>> suffix = ".pdf"
>>> Path(dirname).joinpath(filename).with_suffix(suffix)
PosixPath('/home/reports/daily.pdf')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-25 20:37:27
Solo use os.path.join
para unir su ruta con el nombre de archivo y la extensión. Uso sys.argv
para acceder a los argumentos pasados al script al ejecutarlo:
#!/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')
Simplemente ejecute el script como:
# on windows-based systems
python script.py year
# on unix-based systems
./script.py year
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-05 00:54:55