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'
Author: Damon Julian, 2011-08-20

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.

 176
Author: ʇsәɹoɈ,
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'
 19
Author: Mark Longair,
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')
 17
Author: Eugene Yarmash,
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
 0
Author: albert,
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