Python を使って、出力バリデーションや例外処理に留意しつつ、テキストをファイルに出力するプログラムや一時ファイルの作り方を学ぶ。応用として、小数点以下1万桁の円周率を計算し、その結果をファイルに出力するプログラムを作る。
「7.1 セキュリティ対策の基本」で学んだように、ファイルを書き込むということは、信頼境界の外から取り込んだ(悪意があるスクリプトが含まれているかもしれない)データをパソコンに保存するということだ。「7.2 ファイル入力」において入力バリデーションは施したが、念には念を入れ、出力バリデーションも行うことをおすすめする。出力バリデーションでは、「7.3 正規表現」で学んだ内容を活用する。
一時ファイルは、プログラムが終了すれば消してしまうファイルなのでセキュリティ上のリスクは少ないと言えるが、プログラムの作り方によっては、例外処理やプログラムの異常終了で一時ファイルが残ったままになってしまうことがある。そのようなことにならないようなプログラムの書き方を紹介する。
一時ファイルは、プログラムが終了すれば消してしまうファイルなのでセキュリティ上のリスクは少ないと言えるが、プログラムの作り方によっては、例外処理やプログラムの異常終了で一時ファイルが残ったままになってしまうことがある。そのようなことにならないようなプログラムの書き方を紹介する。
目次
サンプル・プログラム
1行メッセージをファイル出力する
「1.3 画面にメッセージを表示」で紹介した1行メッセージ出力を、ファイルに対して行うプログラム "helloWrite1.py" を用意した。
import atexit
import sys
import pahooValidate as pv
# メイン・プログラム =======================================================
# 初期値
FILENAME = "helloWrite1.txt" # 出力ファイル名
fileEncoding = "utf_8" # 出力ファイルのエンコード = UTF-8
messageStr = "こんにちは(^^)" # 出力テキスト
try:
# ファイルを書き込む(上書き不許可)
with open(FILENAME, "xt", encoding=fileEncoding) as file:
file.write(messageStr)
# コンソールに出力する
print(messageStr)
# ファイルが存在する
except FileExistsError:
pv.dispErrorMessageAndExit(f"'{FILENAME}'が存在するため出力しません")
# その他の例外処理
except Exception as errmsg:
pv.dispErrorMessageAndExit(f"エラーが発生しました -- {errmsg}")
# ファイルをクローズする
else:
file.close()
コンソール出力に比べると、だいぶ、プログラムが長くなっている。
まず、出力ファイル名、出力ファイルのエンコードを各々変数に代入する。これは、「7.2 ファイル入力」と同じことだ。1行メッセージは変数 messageStr に代入しておく。
次に、ファイル処理で失敗することを想定し、try文 の中に処理を記述していく。これも「7.2 ファイル入力」と同じことだ。
「7.2 ファイル入力」と同じように、with文と組み込み関数 open を使う。テキストファイルを書き込むときは、open関数の第2引数はモードを示し、"x" はファイルが存在する場合には失敗する書き込みモードを、"t" はテキストモードを意味する。ファイル書き込みの場合、後述する一時ファイルの場合は除くとして、一般的には既存ファイルを上書きしてしまうのはトラブルの元になるので、xモードでの書き込みと、例外処理を行うことをお勧めする。
これらのモードを一覧に整理しておく。
まず、出力ファイル名、出力ファイルのエンコードを各々変数に代入する。これは、「7.2 ファイル入力」と同じことだ。1行メッセージは変数 messageStr に代入しておく。
次に、ファイル処理で失敗することを想定し、try文 の中に処理を記述していく。これも「7.2 ファイル入力」と同じことだ。
「7.2 ファイル入力」と同じように、with文と組み込み関数 open を使う。テキストファイルを書き込むときは、open関数の第2引数はモードを示し、"x" はファイルが存在する場合には失敗する書き込みモードを、"t" はテキストモードを意味する。ファイル書き込みの場合、後述する一時ファイルの場合は除くとして、一般的には既存ファイルを上書きしてしまうのはトラブルの元になるので、xモードでの書き込みと、例外処理を行うことをお勧めする。
これらのモードを一覧に整理しておく。
モード | 意味 |
---|---|
r | 読み込む(省略時) |
w | 新規に書き込む |
x | 新規に書き込むが、ファイルが存在する場合には失敗する |
a | 新規に書き込むか、ファイルが存在する場合には末尾に追加する |
b | バイナリモード |
t | テキストモード(省略時) |
+ | 更新用に開く(読み込み・書き込み共通) |
with文のブロック内で、fileオブジェクトの writeメソッドを使い、引数で指定したテキストを一気に書き込む。
例外処理として、ファイルが存在する(FileExistsError例外)場合と、その他の例外の場合にはメッセージを表示してプログラムを終了する。pv.dispErrorMessageAndExit関数は、これまでも使ってきた外部モジュール pahooValidate にある関数だ。
最後に close関数を使って fileオブジェクトをクローズするのも「7.2 ファイル入力」と同じだが、ここでは、例外が発生しなかった場合にcloseするよう、elseブロックに記述した。
このように、ファイル出力はコンソール出力と違って様々な例外が発生しうるので、プログラムが長くなる。
では、プログラム "helloWrite1.py" を実行してみてほしい。カレントディレクトリにテキストファイル "helloWrite1.txt" ができているだろう。続けて "helloWrite1.py" を実行すると、エラーメッセージを表示してプログラムが終了する。
例外処理として、ファイルが存在する(FileExistsError例外)場合と、その他の例外の場合にはメッセージを表示してプログラムを終了する。pv.dispErrorMessageAndExit関数は、これまでも使ってきた外部モジュール pahooValidate にある関数だ。
最後に close関数を使って fileオブジェクトをクローズするのも「7.2 ファイル入力」と同じだが、ここでは、例外が発生しなかった場合にcloseするよう、elseブロックに記述した。
このように、ファイル出力はコンソール出力と違って様々な例外が発生しうるので、プログラムが長くなる。
では、プログラム "helloWrite1.py" を実行してみてほしい。カレントディレクトリにテキストファイル "helloWrite1.txt" ができているだろう。続けて "helloWrite1.py" を実行すると、エラーメッセージを表示してプログラムが終了する。
複数行メッセージをファイル出力する
「1.3 画面にメッセージを表示」で紹介した複数行メッセージ出力を、ファイルに対して行うプログラム "helloWrite2.py" を用意した。
import atexit
import sys
import pahooValidate as pv
# メイン・プログラム =======================================================
# 初期値
FILENAME = "helloWrite2.txt" # 出力ファイル名
fileEncoding = "utf_8" # 出力ファイルのエンコード = UTF-8
messageList = ["おはよう", "こんにちは", "こんばんは"] # メッセージ・リスト
# 出力用文字列を生成する.メッセージを改行で区切る.
messageStr = ""
for message in messageList:
messageStr += message + "\n"
try:
# ファイルを書き込む(上書き不許可)
with open(FILENAME, "xt", encoding=fileEncoding) as file:
file.write(messageStr)
try文以降のファイル出力処理は "helloWrite1.py" と同じなので割愛する。
write関数は1行ずつテキストを書き込むのではなく、ファイルに一気に書き込むものなので、「1.3 画面にメッセージを表示」の時と同じで、リストの要素を1つ1つ出力用文字列として変数 messageStr に追加しておき、これを一気に書き込む。
write関数は1行ずつテキストを書き込むのではなく、ファイルに一気に書き込むものなので、「1.3 画面にメッセージを表示」の時と同じで、リストの要素を1つ1つ出力用文字列として変数 messageStr に追加しておき、これを一気に書き込む。
ファイル出力前にバリデーションを行う
プログラム "helloWrite3.py" は、"helloWrite2.py" に加え、ファイル出力前にメッセージが日本語文字であること、サイズが規定値以内であるというバリデーションを行うプログラムである。実行すると、否認されたというエラーメッセージが表示される。これは、「7.3 正規表現」で紹介した validateString関数が働き、出力メッセージに日本語でない文字が含まれていることをキャッチアップした結果である。
import atexit
import sys
import pahooValidate as pv
# メイン・プログラム =======================================================
# 初期値
FILENAME = "helloWrite3.txt" # 出力ファイル名
fileEncoding = "utf_8" # 出力ファイルのエンコード = UTF-8
messageList = ["おはよう", "こんにちは", "Good evening"] # メッセージ・リスト
FILESIZE_MAX = 1000 # 書き込むファイルサイズの最大値(バイト)
# 出力用文字列を生成する.メッセージを改行で区切る.
messageStr = ""
for message in messageList:
messageStr += message + "\n"
# 出力メッセージのバリデーション
try:
# 日本語文字の正規表現+改行
RE_JAPANESE = [r"^[\u3005\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uFF01-\uFF5E]+$"]
# 日本語文字以外は否認,メッセージの長さチェック
pv.validateString(messageStr, RE_JAPANESE, True, 1, FILESIZE_MAX, "出力メッセージ")
# 否認したらエラーメッセージを表示してプログラムを終了する.
except ValueError as errmsg:
pv.dispErrorMessageAndExit(f"エラーが発生しました -- {errmsg}")
try:
# ファイルを書き込む(上書き不許可)
with open(FILENAME, "xt", encoding=fileEncoding) as file:
file.write(messageStr)
プログラムは "helloWrite2.py" と同じだが、ファイル出力する前に、 validateString関数を使い、日本語文字以外は否認し、メッセージの長さが変数 FILESIZE_MAX以下であることをバリデーションする。
「7.1 セキュリティ対策」の一覧表No.2, 4, 5, 6の対策のため、ファイル出力前にバリデーションを実施することをお勧めする。
「7.1 セキュリティ対策」の一覧表No.2, 4, 5, 6の対策のため、ファイル出力前にバリデーションを実施することをお勧めする。
一時ファイルの読み書き
プログラムの処理中に一時ファイル(テンポラリファイル)を作成し、読み書きを行い、プログラムが終了したら一時ファイルを削除するという処理を実装することがある。
Python では、一時ファイルを扱うための標準ライブラリ tempfile が用意されている。プログラム "tempfile1.py" はOSが用意するテンポラリディレクトリに一時ファイルを作成し、読み書きを行い、プログラムが終了する前に削除するプログラムである。
Python では、一時ファイルを扱うための標準ライブラリ tempfile が用意されている。プログラム "tempfile1.py" はOSが用意するテンポラリディレクトリに一時ファイルを作成し、読み書きを行い、プログラムが終了する前に削除するプログラムである。
import os
import tempfile
import atexit
import sys
import pahooValidate as pv
# メイン・プログラム =======================================================
# 初期値
fileEncoding = "utf_8" # 出力ファイルのエンコード = UTF-8
messageStr = "ほげほげ" # 出力テキスト
try:
# OSのテンポラリディレクトリを利用する(処理後削除しない)
with tempfile.NamedTemporaryFile(delete=False) as temp:
with open(temp.name, "w+") as file:
file.write(messageStr)
file.seek(0)
ss = file.read()
print(f"一時ファイルの内容‥‥{ss}")
print(f"close前‥‥{temp.name}/存在 {os.path.isfile(temp.name)}")
# その他の例外処理
except Exception as errmsg:
pv.dispErrorMessageAndExit(f"エラーが発生しました -- {errmsg}")
# 一時ファイルをクローズし削除する
else:
file.close()
# 一時ファイルを削除する
os.remove(temp.name)
print(f"close後‥‥{temp.name}/存否 {os.path.isfile(temp.name)}")
NameTemporaryFile は、OSが用意するテンポラリディレクトリ内に、ユニークなファイル名の一時ファイルを作成する。引数に "delete=True" を指定すると、with文が終了した途端に一時ファイルを削除する。
一時ファイルは、これまで学んできたとおり、open関数を使って作成する。write関数を使って書き込み、read関数を使って読み込む処理も同じだ。ただし、書き込んだ後に、ファイルの先頭まで巻き戻して内容を読み込む必要があるので、seek関数を使って、読み書きの位置を一時ファイルの先頭まで戻してやる。
一時ファイルの名前は temp.name にフルパス名で入っている。そこで、os.path.isfile を実行することで、このファイルが存在しているかどうか分かる。
本来 NamedTemporaryFile(delete=True) として呼び出すべきなのだが、Windows環境ではパーミッションエラーが発生するという制約があるため、ここでは、delete=False で呼び出し、elseブロックの中でcloseし、os.remove を使って一時ファイルを削除してやる。
しかし、例外処理や想定外のプログラム終了があることを考えると、このやり方は安全ではない。プログラム終了後に一時ファイルが残っていると、ディスク容量を無駄に消費したままにしてしまうし、一時ファイル中に守らなければならない情報があった場合にはセキュリティ上の問題を抱えることになる。
一時ファイルは、これまで学んできたとおり、open関数を使って作成する。write関数を使って書き込み、read関数を使って読み込む処理も同じだ。ただし、書き込んだ後に、ファイルの先頭まで巻き戻して内容を読み込む必要があるので、seek関数を使って、読み書きの位置を一時ファイルの先頭まで戻してやる。
一時ファイルの名前は temp.name にフルパス名で入っている。そこで、os.path.isfile を実行することで、このファイルが存在しているかどうか分かる。
本来 NamedTemporaryFile(delete=True) として呼び出すべきなのだが、Windows環境ではパーミッションエラーが発生するという制約があるため、ここでは、delete=False で呼び出し、elseブロックの中でcloseし、os.remove を使って一時ファイルを削除してやる。
しかし、例外処理や想定外のプログラム終了があることを考えると、このやり方は安全ではない。プログラム終了後に一時ファイルが残っていると、ディスク容量を無駄に消費したままにしてしまうし、一時ファイル中に守らなければならない情報があった場合にはセキュリティ上の問題を抱えることになる。
一時ファイルを自動消去
プログラム "tempfile2.py" は、標準ライブラリ tempfile に入っている TemporaryDirectory を使って、Python が一時ディレクトリを作成する。これを使うと、上述の Windows環境の問題を回避することができ、with文が終わった時点で、一時ファイル毎ディレクトリを自動削除する。
import os
import tempfile
import atexit
import sys
import pahooValidate as pv
# メイン・プログラム =======================================================
# 初期値
fileEncoding = "utf_8" # 出力ファイルのエンコード = UTF-8
messageStr = "ほげほげ" # 出力テキスト
TEMPNAME = "tempfile" # 一時ファイル名
try:
# 一時ディレクトリを作成する(処理後削除する)
with tempfile.TemporaryDirectory() as tempd:
fname = tempd + "\\" + TEMPNAME
with open(fname, "w+") as file:
file.write(messageStr)
file.seek(0)
ss = file.read()
print(f"一時ファイルの内容‥‥{ss}")
print(f"close前‥‥{fname}/存在 {os.path.isfile(fname)}")
# その他の例外処理
except Exception as errmsg:
pv.dispErrorMessageAndExit(f"エラーが発生しました -- {errmsg}")
# 一時ファイルをクローズし削除する
else:
file.close()
print(f"close後‥‥{fname}/存否 {os.path.isdir(tempd)}")
ただし、 TemporaryDirectory はユニークな名前の一時ディレクトリを作成するだけで、一時ファイル名はユーザー・プログラム側で用意しなければならない。今回は変数 TEMPNAME に用意したが、一時ファイルが複数あると管理が面倒なことになる。
また、想定外のプログラム終了が起きた時に一時ファイルが残ったままになるのは、NameTemporaryFile と変わらない。
また、想定外のプログラム終了が起きた時に一時ファイルが残ったままになるのは、NameTemporaryFile と変わらない。
一時ファイルを自動消去
標準ライブラリ tempfile には、ディスク上に一時ファイルを作らずに、メモリ上に仮想の一時ファイルを作成する TemporaryFile が用意されている。これを使うと、いままで紹介した問題が一気に解消でき、さらにプログラムを短くすることができる。
import os
import tempfile
import atexit
import sys
import pahooValidate as pv
# メイン・プログラム =======================================================
# 初期値
fileEncoding = "utf_8" # 出力ファイルのエンコード = UTF-8
messageStr = "ほげほげ" # 出力テキスト
try:
# 一時ディテク取りを作成する(処理後削除する)
with tempfile.TemporaryFile(mode="w+") as temp:
temp.write(messageStr)
temp.seek(0)
ss = temp.read()
print(f"一時ファイルの内容‥‥{ss}")
# その他の例外処理
except Exception as errmsg:
pv.dispErrorMessageAndExit(f"エラーが発生しました -- {errmsg}")
TemporaryFile は、メモリ上に仮想の一時ファイルを作成し、with文が終わると同時にそれを消去する。また、open関数を同時に実行するので、with文を二段階で用意する必要がなくなる。
一時ファイルは Pythonが管理するメモリ上に作られるので、たとえプログラムが想定外の終了をしたとしても、一時ファイルが読める形で残ることはない。
以上のことから、Pythonで一時ファイルを使うときは、特段の理由がないかぎり TemporaryFileを利用するのが無難である。
一時ファイルは Pythonが管理するメモリ上に作られるので、たとえプログラムが想定外の終了をしたとしても、一時ファイルが読める形で残ることはない。
以上のことから、Pythonで一時ファイルを使うときは、特段の理由がないかぎり TemporaryFileを利用するのが無難である。
円周率の計算とファイル出力
応用問題として、小数点以下1万桁の円周率を計算し、ファイル出力するプログラム "pi.py" を実行してみてほしい。カレントディレクトリに "pi.txt" というテキスト・ファイルができているはずだ。
なぜファイル出力にしたかというと、1万桁をコンソール出力すると、スクロールなどの影響でファイル出力より時間がかかるためだ。それに、せっかく時間をかけて計算した結果を保管しておかないともったいないこともある。
なぜファイル出力にしたかというと、1万桁をコンソール出力すると、スクロールなどの影響でファイル出力より時間がかかるためだ。それに、せっかく時間をかけて計算した結果を保管しておかないともったいないこともある。
# メイン・プログラム =======================================================
# 初期値
FILENAME = "pi.txt" # 出力ファイル名
DIGITS_MIN = 10 # 小数点以下桁数の最小値
DIGITS_MAX = 10000 # 小数点以下桁数の最大値
DIGITS_PER_COLUMN = 10 # 1列の桁数
DIGITS_PER_LINE = 100 # 1行の桁数
DIGITS_PER_BLOCK = 1000 # 1ブロックの桁数
FILESIZE_MAX = DIGITS_MAX * 2 # 出力ファイルサイズの最大値(バイト)
# キーボードから入力する.
digitStr = input("小数点以下桁数=")
# 入力バリデーションを行う.
try:
digits = pv.validateNumber(digitStr, "int", DIGITS_MIN, DIGITS_MAX, "小数点以下桁数")
# 失敗したらエラーメッセージを表示してプログラムを終了する.
except ValueError as e:
pv.dispErrorMessageAndExit(str(e))
# 成功したら円周率を計算しファイルに格納する.
try:
# 円周率を計算する
pi = compPiChudnovsky(digits)
# 円周率を文字列に変換する
piStr = str(pi)[:digits + 2]
# 読みやすいように空白と改行を挿入する
text = piStr[0] + piStr[1] + "\n"
col = 2
for ch in piStr[2:]:
text += ch
if ((col - 1) % DIGITS_PER_COLUMN == 0):
text += " "
if ((col - 1) % DIGITS_PER_LINE == 0):
text += "\n"
if ((col - 1) % DIGITS_PER_BLOCK == 0):
text += "\n"
col += 1
# 出力文字列のバリデーションチェック+長さチェック
pv.validateString(text, [r"[0-9\.\n\s]"], True 1, digit + 10, "円周率")
# ファイルを書き込む(上書き不許可)
with open(FILENAME, "xt") as file:
file.write(text)
print(f"円周率を '{FILENAME}' に出力しました.")
# ファイルが存在する
except FileExistsError:
pv.dispErrorMessageAndExit(f"'{FILENAME}'が存在するため出力しません")
# その他の例外処理
except Exception as errmsg:
pv.dispErrorMessageAndExit(f"エラーが発生しました -- {errmsg}")
# ファイルをクローズする
else:
file.close()
円周率の計算は、チュドノフスキーの公式を関数 compPiChudnovsky として実装したのだが、本題とは関係がないので解説は割愛する。興味をお持ちの方は、当サイトの記事「C++ で円周率を計算する」をご覧いただきたい。
ここでは、compPiChudnovsky は引数で指定した桁数だけ円周率を計算し、計算結果をDecimal型で返す関数だと認識しておいてほしい。
メイン・プログラムでは小数点以下桁数をキーボード入力で指定する。まず、入力バリデーションを行い、小数点以下桁数 digits が規定の範囲内にあることをチェックする。桁数の最大値は変数 DIGITS_MAX で1万桁にしているが、関数 compPiChudnovsky は10万でも1兆でも計算できる。しかし、Pythonは実行速度が意外に遅く、一般的なパソコンの計算能力では、あまり大きな値にすることはできないだろう。
try文の前半は、Decimal型の計算結果を文字列に変換し、読みやすいように空白と改行を挿入する処理である。
str関数は、これまでにも登場したが、引数(ここではDecimal型)をstr型に変換する組み込み関数だ。[:digits + 2] を付与することで、小数点以下桁数+2文字目までをstr型に変換することを指定している。なぜ2文字を追加するかというと、冒頭の "3." という整数部と小数点そのものが桁数に含まれていないからだ。
空白と改行を挿入する処理では、まず冒頭の "3." で改行し、for文を使って3文字目 [2:] から数えて、DIGITS_PER_COLUMN 文字目ごとに半角空白を挿入、DIGITS_PER_LINE 文字目ごとに改行を挿入、DIGITS_PER_BLOCK 文字目ごとに改行を挿入する。
文字列(str型)に変換したら、前項で学んだとおり、validateString関数を使ってバリデーションを行う。
正規表現 0-9\.\n\s は、0から9の文字(0-9)、または小数点 .、または改行 \n または空白文字 \s のいずれかから成る文字列にマッチする。
ファイルへの書き込み処理は、すでに説明したとおりだ。
ここでは、compPiChudnovsky は引数で指定した桁数だけ円周率を計算し、計算結果をDecimal型で返す関数だと認識しておいてほしい。
メイン・プログラムでは小数点以下桁数をキーボード入力で指定する。まず、入力バリデーションを行い、小数点以下桁数 digits が規定の範囲内にあることをチェックする。桁数の最大値は変数 DIGITS_MAX で1万桁にしているが、関数 compPiChudnovsky は10万でも1兆でも計算できる。しかし、Pythonは実行速度が意外に遅く、一般的なパソコンの計算能力では、あまり大きな値にすることはできないだろう。
try文の前半は、Decimal型の計算結果を文字列に変換し、読みやすいように空白と改行を挿入する処理である。
str関数は、これまでにも登場したが、引数(ここではDecimal型)をstr型に変換する組み込み関数だ。[:digits + 2] を付与することで、小数点以下桁数+2文字目までをstr型に変換することを指定している。なぜ2文字を追加するかというと、冒頭の "3." という整数部と小数点そのものが桁数に含まれていないからだ。
空白と改行を挿入する処理では、まず冒頭の "3." で改行し、for文を使って3文字目 [2:] から数えて、DIGITS_PER_COLUMN 文字目ごとに半角空白を挿入、DIGITS_PER_LINE 文字目ごとに改行を挿入、DIGITS_PER_BLOCK 文字目ごとに改行を挿入する。
文字列(str型)に変換したら、前項で学んだとおり、validateString関数を使ってバリデーションを行う。
正規表現 0-9\.\n\s は、0から9の文字(0-9)、または小数点 .、または改行 \n または空白文字 \s のいずれかから成る文字列にマッチする。
ファイルへの書き込み処理は、すでに説明したとおりだ。
練習問題
次回予告
Python では、標準ライブラリの osモジュールや shutilモジュールを利用することで、OSが管理しているディレクトリの操作や情報を取得することができる。次回は、これらのモジュールを利用し、ファイル一覧を表示したり、パターンに一致するファイルを数えたり、ディレクトリごとバックアップするプログラムを作ってみる。
コラム:ファイルI/O
「7.1 セキュリティ対策の基本」で信頼境界について学んだが、信頼境界を跨ぐルートは少なければ少ないほどセキュリティ対策をしやすい。そこで理想を言えば、ファイル入力は1カ所にまとめ、たとえば汎用のファイル入力クラスを用意するといいだろう。また、ファイル出力についても同様に1カ所にまとめるために、汎用のファイル出力クラスを用意しておくといいだろう。
セキュリティ対策を脇に置いたとしても、マルチスレッド処理で複数のスレッドから同一のファイルを読み書きするケースがある。この場合、異なるスレッドが同時に書き込みすることでファイル内容が矛盾したり壊れてしまわないよう、排他処理を行う必要がある。その意味でも、少なくともそのファイルへの出力処理は1カ所にまとまっていないと、管理が難しくなる。
ファイルの入出力は、プログラム・ロジックに比べると応答速度が遅い処理である。そこで、JavaScript はファイル入出力を非同期で動かすことで、本体ロジックの処理速度に影響が出ないようにする機能を備えている。Python で業務プログラムを組むときにも、ファイル入出力クラスを別スレッドで動かすなどの工夫をするといいだろう。
ファイルの入出力は、プログラム・ロジックに比べると応答速度が遅い処理である。そこで、JavaScript はファイル入出力を非同期で動かすことで、本体ロジックの処理速度に影響が出ないようにする機能を備えている。Python で業務プログラムを組むときにも、ファイル入出力クラスを別スレッドで動かすなどの工夫をするといいだろう。
(この項おわり)