построение полного пути к файлу в python,


мне нужно передать имя файла в модуль, который создает отчет в формате pdf,html и т. д.Как построить путь к файлу из имени каталога, базового имени файла и строки fileformat ?

каталог может существовать или не существовать на момент вызова

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

мне нужно создать строку '/home/me/dev/my_reports/daily_report.pdf'

объединение частей вручную не казалось хорошим способом. Я попробовал ОС.путь.присоединяйтесь

join(dir_name,base_filename,format)

но это дает

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

4 ответа:

это прекрасно работает:

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

имейте в виду, что os.path.join() существует только потому, что разные операционные системы используют разные символы разделителя пути. Он сглаживает эту разницу, поэтому кросс-платформенный код не должен быть загроможден специальными случаями для каждой ОС. Нет необходимости делать это для имени файла "расширения" (см. сноску), потому что они всегда отделены от остальной части имени одним и тем же символом точки На каждой ОС.

при использовании функции в любом случае заставляет вас чувствовать себя лучше (и вам нравится без необходимости усложнять свой код), вы можете сделать это:

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

если вы предпочитаете, чтобы ваш код был чистым, просто включите точку в суффикс:

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

сноска: в операционных системах, отличных от Micorsoft, нет такого понятия, как имя файла "расширение". Его присутствие на Windows происходит от MS-DOS и FAT, которые заимствовали его из CP/M, который был мертв в течение десятилетий. Эта точка-плюс-три буквы, которыми многие из нас являются привыкли видеть-это просто часть имени файла на любой другой современной ОС, где нет встроенного смысл.

Эм, почему бы просто не:

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

Если вам посчастливилось работать на 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')

просто использовать 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