レポートドキュメントを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'
これはうまくいきます:
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のファイル名の一部であり、組み込みの意味はありません。
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')
ええと、なぜだけではありません:
>>>> import os
>>>> os.path.join(dir_name, base_filename + "." + format)
'/home/me/dev/my_reports/daily_report.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 __== '__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