Python(ファイル処理とwith構文)
ファイルの読み書きを行う場合、定められた手順に沿ってプログラムを書く必要があります。
1.ファイルを開く open()
2.ファイルを読み書きする read()、write()
3.ファイルを閉じる close()
1行ずつ読むことの利点は、メモリに記録できる量に限りがあり、巨大なデータは読み込みエラーになってしまうことを回避できることです。 enumerate()関数はイテレータのインデックス番号と要素の値を得ることができます。 文字列にはfind()メソッドがあり、これは0から数えて何文字目に検索文字列があるのかを返し、見つからなければ-1を返します。
リストや辞書など複雑なデータを保存するのに便利なのがJSON形式です。
※fpはopen()関数の戻り値を指定
1.ファイルを開く open()
2.ファイルを読み書きする read()、write()
3.ファイルを閉じる close()
# ファイルの読み書き<手順に注意>
# 1. ファイルを開く
#a_file = open("test.txt",encoding = "utf-8")
#a_file = open("test.txt",mode="w",encoding = "utf-8")
a_file = open("test.txt",mode="a",encoding = "utf-8")
# 2. ファイルを読み書きする
try:
#s= a_file.read()
a_file.write("hoge\n")
a_file.write("1234\nあああああああああああ\n")
a_file.write("/*-\n")
# 3. ファイルを閉じる
finally:
a_file.close()
#print(s)
encodingの引数で、文字エンコーディングをShift_JISにする場合は"sjis"に変更します。
mode引数には書き込みモード"w"、読み込みモード"r"(デフォルト)、追記モード"a"、バイナリモード"b"、テキストモード"t"(デフォルト)を指定することができます。
modeやencodingは名前付き引数で、引数の順番が前後しても大丈夫です。
また、ファイルの読み書きを行う場合、ファイルを読み込んでいる途中で、別の誰かがファイルを削除してしまうこともありえるので、例外処理try...finally...を用いて記述する必要があります。
with構文
# with構文で自動的にclose()を呼ぶ
with open("test.txt",mode="w",encoding="utf-8") as f:
f.write("I'm happy\n")
f.write("But I'm sad\n")
try...finally... を使うことなく、自動的に処理の最後にclose()メソッドを呼んでくれます。
テキストファイルを1行ずつ処理
# テキストファイルを1行ずつ処理
#with open("test.txt",encoding="utf-8") as f:
# for line in f:
# print(line)
# テキストからキーワードを探す
key = "sad"
with open("test.txt",encoding="utf-8") as f:
for i,line in enumerate(f):
if line.find(key)>=0:
print(i+1,":",line)
open()メソッドの戻り値をfor構文に与えると、テキストファイルの内容を1行ずつ表示できます。1行ずつ読むことの利点は、メモリに記録できる量に限りがあり、巨大なデータは読み込みエラーになってしまうことを回避できることです。 enumerate()関数はイテレータのインデックス番号と要素の値を得ることができます。 文字列にはfind()メソッドがあり、これは0から数えて何文字目に検索文字列があるのかを返し、見つからなければ-1を返します。
Pythonのオブジェクトや変数を保存
上記のテキストファイルを読み書きする方法は、文字列を読み書きする方法でした。リストや辞書など複雑なデータを保存するのに便利なのがJSON形式です。
import json
data={"no":5,"code":("jas",1,19),"scr":"hello"}
filename = "test.json"
with open(filename,"w") as fp:
json.dump(data,fp)
with open(filename,"r") as fp:
r = json.load(fp)
print("no=",r["no"])
print("code=",r["code"])
print("scr=",r["scr"])
jsonモジュールを利用することで以下の関数を利用することができます。※fpはopen()関数の戻り値を指定
関数 | 説明 |
json.dumps(obj) | オブジェクト(obj)をJSON文字列に変換 |
json.loads(json) | JSON文字列をPythonのオブジェクトに変換 |
json.dump(obj,fp) | オブジェクト(obj)をJSON形式でファイル(fp)に保存 |
json.load(fp) | JSON形式のファイル(fp)からデータを読み出す |