Создайте полный путь к файлу в Python - PullRequest
148 голосов
/ 20 августа 2011

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

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

например

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'

Ответы [ 4 ]

230 голосов
/ 20 августа 2011

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

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, который был мертв в течение десятилетий.Точка плюс три буквы, которые многие из нас привыкли видеть, является лишь частью имени файла в любой другой современной ОС, где оно не имеет встроенного значения.

27 голосов
/ 25 мая 2017

Если вам посчастливилось запустить 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')
21 голосов
/ 20 августа 2011

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

>>>> import os
>>>> os.path.join(dir_name, base_filename + "." + format)
'/home/me/dev/my_reports/daily_report.pdf'
0 голосов
/ 09 июня 2015

Просто используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...