演習ファイルを作ろう(Python学習)

皆さんこんにちは、HiroCom777です。現在所属しているノンプロ研でPython初級講座のTA(ティーチングアシスタント)を担当しています。Pythonおもしろいですね。ところでこの講座、毎回演習と宿題が山の様にあります。問題ごとにプログラムファイル(テキストファイル)を作るわけですが、これが量があって結構大変!!そこで、講師のこはたさんからは、以下の方法をご紹介頂きました。

moripro.net

おお、この記事すごい。プログラム無しで大量のファイルやフォルダーを作れるんですね。

でもここはPython初級講座。折角学んでいるんだし、Python使ってファイル作ってみたいじゃないですか!!

と言う訳で、この記事ではたくさんある演習用ファイルのひな形をPythonで自動的に作ってみたいと思います!!

演習ファイルを作る

この講座ではPythonのプログラムを学ぶのですが、使用しているツールはJupyter Notebookです。

jupyter.org

ファイル形式もJupyter Notebook(拡張子は .ipynb)となります。実態はテキストファイルなので、この形式の空のファイルを名前を付けて作ればいいと思います。ファイルを作りたいフォルダーに、作るファイルの名前をリストにしテキストファイル(FileList.txt)に保存しておきます。こんな感じです。

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

続いて、以下のコード(MakeFile001.py)を書きました。

fr = open('FileList.txt', 'r')
for text in fr.readlines():
    fw = open(text + '.ipynb', 'w')
    fw.close()
fr.close()

コードの解説

Pythonでテキストファイルにアクセスするには組み込み関数のopen()を使います。カッコの中の第1引数はファイル名を指定します。第2引数はモードの指定です。「'r'」で読込み、「'w'」で書込みとなります。1行目はファイルFileList.txtを読込むために開いて変数「fr」にセットします。

読込みの指定で開いたファイルは、readlines()メソッドが使えます。このメソッドはファイルの内容をすべて読込んでリスト形式で返します。この内容をfor文で1つずつ取り出して「text」にセット。拡張子「.ipynb」を追加して、このファイル名で書込みを指定してファイルをオープンして「fw」にセットします。

open()で開いたファイルはclose()メソッドでクローズしなければなりません。「fw」は書き込む内容がないので、そのままクローズします。リストのファイルをすべて作り終わったら、最初に開いた「fr」もクローズして終了です。完璧じゃないですか!!

実行してみる

上記で作成したMakeFile001.pyも、ファイルを作りたいフォルダーに保存しておきます。さっそく実行してみましょう!! あれ?何かのエラーが・・・

    fw = open(text + '.ipynb', 'w')
OSError: [Errno 22] Invalid argument: '演習2-01\n.ipynb'

Invalid argument、つまり引数がおかしいということですね。ファイル名が「演習2-01\n.ipynb」となっています。「\n」は改行ですね。readlines()メソッドで読込んでいる内容を確認してみましょう。以下のコードを実行してみます。

fr = open('FileList.txt', 'r')
print(fr.readlines())
fr.close()

結果は・・・

['演習2-01\n', '演習2-02\n', '演習2-03\n']

やっぱり・・・readlines()メソッドはリストを作るときに改行も含めるんですね。

最後の1文字をとる

つまり、リストの内容から最後の1文字(改行)を省いてファイル名を指定すればいいわけです。Pythonでは文字列を切り取る(スライスする)機能がありましたね。それに、文字の位置をマイナスの数値を使って後ろから指定する機能もありました。最後の値は未満で指定されるので、先頭から最後の文字の1つ前までを選択するには

text[0:-1]

とすれば良さそうです。先頭から指定する場合は値を省略できるので、コード(MakeFile002.py)は以下の様になりました。

fr = open('FileList.txt', 'r')
for text in fr.readlines():
    fw = open(text[:-1] + '.ipynb', 'w')
    fw.close()
fr.close()

実行してみると・・・おお、今度はちゃんとファイルを作りました!!

これで完成、と思いきや

こうやって簡単なツールを作ってみると、学びになりますね。でも、これで完成じゃなかったんです。ファイルの中身は空っぽだとダメだったんですね。続きは次回に書きます。お楽しみに!!

hirocom777.hatenadiary.org