概要
空のファイル0001_output.logから1000_output.logを連番で作成する必要性が生じたので、Pythonプログラムで実装しました。
今回は、ENVファイルのようなもので作成回数や作成ファイル名を制御できるようにしたかったので、コードの中にそれらを埋め込まないように工夫しました。サンプルコードを紹介します。
サンプルコード
import os
output_logs_dir = 'output_logs'
number_of_file = 1000
log_name = '_output.log'
# outputファイルをnumber_of_file個作成する
for i in range(1, number_of_file + 1):
filename = os.path.join(output_logs_dir, f"{i:0{len(str(number_of_file))}}{log_name}")
open(filename, 'a').close()
上記コードを実行すれば、空のファイル0001_output.logから1000_output.logまでの連番ファイルを一瞬で作成できました。
コード解説
filename = os.path.join(output_logs_dir, f"{i:0{len(str(number_of_file))}}{log_name}")の部分では、ファイル名を作成しています。
os.path.joinという関数を使って、ディレクトリ名とファイル名を結合、さらにゼロ埋めされた数値と指定したlog_nameを組み合わせる形にしています。
最後のopen(filename, 'a').close():の'a'オプションは、ファイルを追記モードで開くという意味。ファイルが既に存在する場合はそのままで、存在しない場合は新規作成します。
close()によってすぐ閉じているのは、リソースを解放するため。ファイルを開いたままにするより閉じた方がパフォーマンスは良くなるため、一般的にこのような記載をするようです。
ただし、closeを書き忘れる、というリスクもあるためwith文を使ったコードもよく見られます。withブロックが終了する時に自動的にclose()メソッドが呼び出されるため、closeを書く必要がありません。その場合は以下のように書きます。
with open(filename, 'a'):
pass
with文は、データベース接続とカーソルの作成・クローズを自動的に処理する際にも登場しますね。
補足
上述の通り、今回はPythonプログラムを利用しつつENVファイルで調整できるようにするため、上記のようなサンプルコードにしました。
単純にスクリプトファイルで作成することもできます。
#!/bin/bash
for i in {1..100}; do
touch $(printf "%03d_output.log" "$i")
done
100個のoutput_logファイルを作成する場合は上記の通りtouchコマンドで可能です。
for i in {1..100}; doでforループを始め、doneで終了します。
printfコマンドは、第一引数のフォーマット文字列に対して、それに続く引数を順に代入するコマンド。%03dは整数を3桁のゼロ埋めで出力することを指定するフォーマット指定子です。
つまり、例えば、以下のようになります。
・printf "%03d" 7 → 出力は007
・printf "%03d" 5 2 → 出力は005002
・printf "%03d" → 出力は000
また、対象ファイルの中身に何か書いてあるとして、同じ内容のまま、ファイル名を連番で複製していく方法もあります。以前記事にしたのでよければご参考までに。