在Python中构建完整路径文件名,

问题描述:

我需要将文件路径名传递给模块,该模块创建报告文档为pdf,html等。如何从目录名,基本文件名和fileformat字符串?在Python中构建完整路径文件名,

目录可能会或可能不会在呼叫

的时间存在例如

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

我需要创建一个字符串'/home/me/dev/my_reports/daily_report.pdf'

串接件手工似乎没有什么是一个好方法。 我试图os.path.join

join(dir_name,base_filename,format) 

但它给

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

这工作得很好:

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

保持记住os.path.join()存在可平滑不同操作系统使用的不同路径分隔符字符,因此您的代码不必每个都有特殊情况。文件名称“扩展名”在一个主要操作系统上仅具有重要意义(它们只是非Windows系统上文件名的一部分),其分隔符总是一个点。有没有必要的功能加入他们,但如果使用一个让你感觉更好,你可以这样做:

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

或者,如果你想保持你的代码非常干净,简单地包括后缀点:

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

您提到OS分隔符可能不是'.'。对于这个可以使用'os.extsep'。 – sjbx

+1

我没有提到这样的事情。 –

+3

你花了一些时间来解释'文件名'扩展名'在一个主要的操作系统上只有重要的含义(它们只是非Windows系统文件名的一部分),它们的分隔符总是一个点' 。 OP还表示他们最终看到/ pdf。所以你可以做'os.path.join(dir_name,base_filename,os.extsep,extension)'。你的回答是完全正确的。 – sjbx

嗯,为什么不干脆:

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

感谢,但我希望有附加的是extension..python的更清洁的方式甚至有一个splitext功能,切断必须有一些东西到extension..so做相反 –

+1

splitext函数保留'。'在扩展的前面。这可能是最干净的方式。如果你希望它在你的代码中“看起来”更干净,我建议使用函数或lambda函数。 – Vorticity

只需使用os.path.join即可将文件名和扩展名加入到路径中。在执行时,它使用sys.argv来访问传递给脚本的参数:

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

只需运行像脚本:

# on windows-based systems 
    python script.py year 

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

如果你足够幸运,执行Python 3.4+,您可以使用pathlib

>>> from pathlib import Path 
>>> dirname = "/home/reports" 
>>> filename = "daily" 
>>> suffix = ".pdf" 
>>> Path(dirname).joinpath(filename).with_suffix(suffix) 
PosixPath('/home/reports/daily.pdf')