2011-08-20 20 views
97

Necesito pasar un nombre de ruta de archivo a un módulo que crea un documento de informe como pdf, html, etc.¿Cómo puedo compilar el nombre de ruta de archivo desde un nombre de directorio, nombre de archivo base y fileformat cadena?creación de nombre de archivo de ruta completa en python,

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' 

que necesito para crear una cadena '/home/me/dev/my_reports/daily_report.pdf'

concatenando las piezas manualmente no parecía estar una buena manera. me trataron os.path.join

join(dir_name,base_filename,format) 

pero da

'/home/me/dev/my_reports/daily_report/pdf' 

Respuesta

144

Esto funciona bien:

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

Keep en mente que os.path.join() existe para suavizar los diferentes caracteres separadores de ruta utilizados por los diferentes sistemas operativos, por lo que su código no tiene que tener un caso especial cada uno. Las "extensiones" de nombre de archivo solo tienen un significado significativo en un sistema operativo importante (simplemente son parte del nombre del archivo en sistemas que no son de Windows), y su separador siempre es un punto. No hay necesidad de una función para unirse a ellos, pero si se utiliza uno hace sentir mejor, usted puede hacer esto:

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

O, si desea mantener su código muy limpio, basta con incluir el punto en el sufijo :

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

Mencionó que el separador de sistema operativo puede no ser '.'. Para esto uno puede usar 'os.extsep'. – sjbx

+1

No mencioné tal cosa. –

+3

Ha hecho todo lo posible para explicar que las extensiones de "nombre de archivo" solo tienen un significado significativo en un sistema operativo importante (son simplemente parte del nombre de archivo en sistemas que no son de Windows) y su carácter separador siempre es un punto ' . El OP también expresó que vieron/pdf al final. Así que podrías haber hecho 'os.path.join (dir_name, base_filename, os.extsep, extension)'. Tu respuesta es perfectamente correcta. – sjbx

19

Um, ¿por qué no:

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

gracias, pero esperaba que hubiera una manera más clara de añadir que la extensión ...python incluso tiene una función de texto en seco para cortar la extensión ... así que tiene que haber algo para haga lo inverso –

+1

La función splitext conserva el '.' al frente de la extensión. Esta es probablemente la forma más limpia de hacerlo. Si quieres que se vea más limpio en tu código, te sugiero usar una función o una función lambda. – Vorticity

0

Simplemente use os.path.join para unir su ruta con el nombre de archivo y la extensión. sys.argv utilizar 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') 

sólo tiene que ejecutar la secuencia de comandos como:

# on windows-based systems 
    python script.py year 

    # on unix-based systems 
    ./script.py year 
9

Si tienen la suerte de estar en ejecución Python 3.4+, puede utilizar pathlib:

Cuestiones relacionadas