web-dev-qa-db-ja.com

Pythonにフルパスファイル名を作成します

レポートドキュメントを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'
142
Damon Julian

これはうまくいきます:

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

os.path.join()は、異なるオペレーティングシステムが異なるパス区切り文字を使用するためにのみ存在することに注意してください。この違いが滑らかになるため、クロスプラットフォームコードを各OSの特殊なケースで煩雑にする必要がありません。ファイル名「拡張子」(脚注を参照)に対してこれを行う必要はありません。それらは、すべてのOSで常にドット文字で名前の残りの部分に接続されているためです。

とにかく関数を使用すると気分が良くなる場合(そして、コードを不必要に複雑にすることが好きな場合)、これを行うことができます:

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から来ており、FATはそれをCP/Mから借りてきました。私たちの多くが見慣れているドットと3文字は、他のすべての最新のOSのファイル名の一部であり、組み込みの意味はありません。

223
ʇsәɹoɈ

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')
25
Eugene Yarmash

ええと、なぜだけではありません:

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

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 __== '__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
0
albert