Создайте полный путь к файлу в 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

Ответ 1

Это отлично работает:

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)

(Этот подход также совместим с суффиксными соглашениями в pathlib, который был представлен в python 3.4.)


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

Ответ 2

Если вам посчастливилось запустить Python 3. 4+, вы можете использовать pathlib:

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

Ответ 3

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

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

Ответ 4

Просто используйте os.path.join, чтобы присоединиться к вашему пути с именем файла и расширением. Используйте sys.argv для доступа к аргументам, переданным script при его выполнении:

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

Просто запустите script как:

   # on windows-based systems
   python script.py year

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