概要
空のファイル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
また、対象ファイルの中身に何か書いてあるとして、同じ内容のまま、ファイル名を連番で複製していく方法もあります。以前記事にしたのでよければご参考までに。