ファイルリスト(Python学習)

ファイルリスト

Pythonを使ってPython講座に使うファイルの自動作成に挑戦しています。今回は4回目です。 前回の記事はコチラになります。

hirocom777.hatenadiary.org

前回は、無事に使えるファイルを作ることができました。実際に使えるツールができ上ると楽しいです!!

ところで実際のPython講座ではたくさんの演習、宿題があります。いままでは作成するファイル名のリストをテキストファイル(FileList.txt)に書き込んでおいてから、その内容を読込んでファイル作成という手順を踏んでいました。でも、ここまでくるとリストのファイル作成自体も面倒になってきました。作成が必要なPython初級講座は1回の講座につき10以上にのぼります。今回は、ここをPythonで自動化してみましょう。

ファイルを自動で作る

演習用ファイルのファイル名は1回目でご紹介した通り、以下のような感じです(拡張子は .ipynb)。

演習2-01
演習2-02
演習2-03

頭の文字は同じでハイフンで繋げて01から始まる2桁の通し番号なります。つまり、先頭の文字と演習回数がわかればファイルリストを作れるわけです。この2つの要素をプログラムの冒頭で指定できれば、後はその内容でファイルリストを作ることができます。

入力を促す

プログラム冒頭で先頭の文字と演習回数の入力を促せればいいんですね。以下のプログラムを書いてみました。

head  = input("先頭の文字?")
times = int(input("演習回数?"))
with open('FileList.txt', 'w') as fm:
    for filenumber in range(1, times + 1):
        filename = head + "-" + str(filenumber).rjust(2,'0')
        fm.write(filename + '\n')

実行してみると最初に「先頭の文字?」と聞かれてきますので「演習2」と入力します。続いて「演習回数?」と聞かれますので「12」と入力しました。作成されたファイル(FileList.txt)を開くと、以下の内容になっていました。

演習2-01
演習2-02
演習2-03
   ・
   ・
演習2-09
演習2-10
演習2-11
演習2-12

成功です。前回作成したプログラム(MakeFile004.py)の直前にこれを実行すれば、いちいちテキストファイルを編集しなくてもいいですね!!でも、何かいろいろ新しいやつが出てきましたので解説してみようと思います。

解説

それでは解説です。

input() 関数

input() 関数はキーボードによる入力を促します。入力れた内容を文字データとして返します。何かを入力しもらいたい時に使いますね。

int() 関数、str() 関数

input() 関数で返されるデータは文字データです。今回の場合先頭の文字はそのままでいいのですが、演習回数は入力された内容で繰り返しの作業を行いますので整数のデータに変換しなければなりません。int() 関数は引数で渡された文字データを整数型に変換して返す関数です。 str() 関数は逆に、引数で渡されたデータを文字列に変換します。今回はファイル名を構成する一部にするため文字列に変換しています。

range() 関数

range() 関数は引数で渡された値からリストオブジェクトを作成して返します。最初の値と最後の値をコンマ区切りで指定すると、最初の値から最後の値-1(ここ注意)の連番のリストを返します。このプログラムではrange() 関数で作成されたリストをfor文で回してファイル名を作成しています。

rjust()メソッド

今回のプログラムではファイル名の演習回数を、2桁の通し番号で表しています。ご紹介したstr() 関数では単純に文字データに変換するだけで、この様な処理はしません。こんな時には文字列データのrjust()メソッドを使うと便利です。最初の引数に文字数を指定して、コンマ区切りで次の引数で文字を指定すると、指定した文字を先頭に追加して、指定した文字数にした結果を返します。ちなみに、この様にゼロ埋めする事をゼロパディングと言うそうです。 先頭ではなく後ろに文字を追加するljust()メソッドというものもあります。

ファイルじゃなくても良くない?

ここまで来て思ったのですが、いちいちテキストファイルを作らなくてもプログラム内でリストを作成して渡してしまえば良くありませんか?プログラム(MakeFile005.py)は以下の様になりました。

head  = input("先頭の文字")
times = int(input("演習回数"))
for filenumber in range(1, times + 1):
    filename = head + "-" + str(filenumber).rjust(2,'0')
    if filenumber == 1:
        filelist = [filename]
    else:
        filelist += [filename]

for text in filelist:
    with open(text. + '.ipynb', 'w') as fw:
        fw.writelines(['{\n',
        ' "cells": [],\n',
        ' "metadata": {},\n',
        ' "nbformat": 4,\n',
        ' "nbformat_minor": 2\n',
        '}\n'])

リスト処理にしたおかげで文字列最後の改行コードもなくなったので、rstrip()メソッドも不要となりました。これで、いちいちリストファイルを作らずに実行できますね。ていうかファイル名のリスト作っている時点でループしているので、同時にファイル作ってしまえばいいんですよね!!プログラム(MakeFile006.py)は以下の様になりました。

head  = input("先頭の文字?")
times = int(input("演習回数?"))
for filenumber in range(1, times + 1):
    filename = head + "-" + str(filenumber).rjust(2,'0')
    with open(filename + '.ipynb', 'w') as fw:
        fw.writelines(['{\n',
        ' "cells": [],\n',
        ' "metadata": {},\n',
        ' "nbformat": 4,\n',
        ' "nbformat_minor": 2\n',
        '}\n'])

スッキリしましたね!!処理もシンプルです。

次回はフォルダー

ところでPython講座は複数回にわたって開講されています。毎回の演習は回数ごとにフォルダーを作って管理します。次回はフォルダーの作成に挑戦します。お楽しみに!!

hirocom777.hatenadiary.org