Pythonを使ってPython講座に使うファイルの自動作成に挑戦しています。今回は3回目です。 前回の記事はコチラになります。
前回はJupyterファイルの内容がどのようなものか調べました。Jupyterファイルの正体は、JSON形式のテキストデータなんですね。
今回は、空のファイルに最低限のJSON形式のデータを書き込んでみようと思います。
書込みを実行する
まずは前回ご紹介したJupyterで作った何も書き込んでいないファイルの内容を再掲します。
{ "cells": [], "metadata": {}, "nbformat": 4, "nbformat_minor": 2 }
この内容を空のファイルに書き込んでいきます。空のファイルを作成したプログラム(MakeFile002.py)も再掲します。
fr = open('FileList.txt', 'r') for text in fr.readlines(): fw = open(text[:-1] + '.ipynb', 'w') fw.close() fr.close()
このプログラムではファイルを作成するために、指定されたファイル名で書込み設定でファイルをオープンして「fw」にセットしています。直後にクローズして空のファイルが作成されるので、この手前に書込みの手順を記述すればいいでしょう。
書込み設定で開いたファイルにデータを書き込むには、write()メソッドを使用します。このメソッドは引数で指定した内容をファイルに書き込みます。コード(MakeFile003.py)は以下の様になりました。
fr = open('FileList.txt', 'r') for text in fr.readlines(): fw = open(text[:-1] + '.ipynb', 'w') fw.write('{' + '\n') fw.write(' "cells": [],' + '\n') fw.write(' "metadata": {},' + '\n') fw.write(' "nbformat": 4,' + '\n') fw.write(' "nbformat_minor": 2' + '\n') fw.write('}' + '\n') fw.close() fr.close()
各行の書込みの最後には改行コード(/n)を追加します。実行して作成されたファイルをJupyter Notebookで開いてみると・・・あ、開くことができました。
さらなる改善
ここまできて、ちょっと欲が出てきました。もっとシンプルな書き方はできないのでしょうか。
1行で書き込みたい
今回はwrite()メソッドを行数文繰り返して書込みを行いましたが、一度に全部書き込む方法はないのでしょうか?全部の文字列を足した形で書き込むこともできますが、ちょっとスマートじゃないですね。そういう時はwritelines()メソッドを使えます。writelines()メソッドは引数にリストやタプルなどのオブジェクトを指定して、その内容を書き込むことができます。
close処理が面倒
組み込み関数open()で開いたファイルはclose()メソッドでクローズしなければなりません。with文を使用するとこの処理を省くことができます。書き方は以下の通りです。
with open(ファイル名, モードの指定) as 変数: # 処理を記述
これで、ファイルをオープンした後にブロックの処理を完了すると自動的にファイルをクローズしてくれます。
改行コードだけ削除したい
このプログラムでは取得したファイル名から改行コードを削除するためにスライスを使っています。でも今回の作業中間違ってFileList.txtの中身を以下の様にしてしまいました。
演習2-01 演習2-02 演習2-03 <-最終行だけ改行を忘れた
この結果、最後のファイル名が「演習2-0.ipynb」になってしまいました。改行コードのかわりに「3」が削除されてしまいました。最後の文字が改行コードの時だけ削除するようにしたいです。そんな時には文字列型のrstrip()メソッドが使えます。rstrip()メソッドは引数で指定した文字列が末尾にある場合に、その部分を削除した文字列を返します。また、引数を削除すると空白文字(スペース、タブ、改行など)を削除できます。
似たようなものにlstrip()メソッド(文字列の先頭部分を削除)や、strip()メソッド(文字列の先頭部分と末尾の部分を削除)があります。
改善版
これらの手法を使うと以下の様にプログラミングできます。
with open('FileList.txt', 'r') as fr: for text in fr.readlines(): with open(text.rstrip() + '.ipynb', 'w') as fw: fw.writelines(['{' + '\n', ' "cells": [],' + '\n', ' "metadata": {},' + '\n', ' "nbformat": 4,' + '\n', ' "nbformat_minor": 2' + '\n', '}' + '\n'])
ちょっとエッジが効いた感じになってきましたね。もちろんちゃんと動作しますよ!!
次回はファイルリスト
いかがでしょうか?無事にファイルを作ることができました。それに書き方もいろいろ工夫できるんですね。ここまでできたら作成するファイル名を記載するFileList.txtも自動でつくりたいですね。お楽しみに!!