# テキストファイル操作

これまで書いてきたプログラムでは、一度実行した後にもう一度実行しても前のデータは引き継がれないためデータの永続化をする必要があります。

データの永続化には複数の方法があり、一番シンプルな方法としてテキストファイルに記述していく方法があります。

サンプルデータ

サンプルデータ をダウンロードしましょう。

# 読み込み

ファイルを操作するためにはopen()関数で開く必要があります。

f = open('7-1.txt', 'r')

このままだとデータを読み込めないのでread()関数を使用します。

f = open('7-1.txt', 'r')
data = f.read()
f.close()

dataにデータが格納されているためそれを読み取ることが可能です。

f = open('7-1.txt', 'r', encoding='UTF-8')

data = f.read()
print(data)

f.close()

このままでは扱いにくいため一行ずつ読み込みます。 readlines()関数を使用することで一行ずつ配列に代入できます。

f = open('7-1.txt')

data = f.readlines()
print(data[0])
print(data[1])

f.close()

# 書き込み

# モード

これまで開いていたものは読み取りモードで開いています。

モード 説明
r 読み込み(ファイルが存在しないとエラー)
r+ 読み込み&書き込み(ファイルが存在しないとエラー)
w 書き込み(ファイルの中身をクリア)
w+ 読み込み&書き込み(ファイルの中身をクリア)
a 書き込み用(ファイルの末尾に追記)
a+ 読み込みおよび書き込み用(ファイルの末尾に追記)
x 書き込み用(ファイルが存在している場合はエラー)
x+ 読み込みおよび書き込み用(ファイルが存在している場合はエラー)
b バイナリモード
t テキストモード

# エンコード

文字列にはエンコードと呼ばれる決まった方式があります。

雉「譏主ュヲ髯「鬮倡ュ牙ュヲ譬。
解答
賢明学院高等学校

文字化けテスター (opens new window)というツールを使うことで簡単に文字化けを発生させることが可能です(上の文字列は奇跡的に復元できただけです)

C:¥Users¥Admin¥Desktop¥Python

C:₩Users₩Admin₩Desktop₩Python

C:\Users\Admin\Desktop\Python

# 書き込みモード

モード 説明
w 存在しない場合新規作成して上書き
a 存在しない場合新規作成して追記
x 新規作成して書き込み(存在する場合はエラー)
f = open('myfile.txt', 'w')

f.write('こんにちは\n')

f.close()
`\n`について

\nは改行を表す文字列で本来はLFという改行を示す記号(=\n)がコンピュータ的に書き込まれます。

LFはラインフィールドの略でカーソルを行の先頭へ移動せずに、次の行へ下に移動します。

しかしWindowsは歴史的経緯からCRLFという記号(=\r\n)が書き込まれます。

CRはキャッジリターンといい、次の行へ進まずに、カーソルを行の先頭へ移動します。

CRLFはカーソルを下へ移動してから行の先頭へ移動します。

本来は処理を書き換える必要があるのですがPythonでは\nCRLFが書き込まれます。

なぜこのようなややこしいことになっているかというと、タイプライターの影響があります。

CRだけだと先頭の行に、LFだけだとそのままカーソルを下に動かすためタイプライターで考えるとCRLFが正確です。

しかしWindows以外のほとんどすべてのOS(Mac OS 9以前はCRのみであった。OS XになってからLFに変更された)においてLFのみであるため自分で実装する必要がある時には注意が必要です。

プログラムを動かす時にもエラーが発生することがあるのでLFで統一する方がおすすめです(VSCodeでは右下にLFと表示されているはずです)

utf8-lf

writelines()で配列の中の文字列を順に書き込むことが可能です。

f = open('7-1-write.txt', 'w')

datalist = ['Windows 95\n', 'Windows 98\n', 'Windows 2000\n']
f.writelines(datalist)

f.close()
f = open('7-1-write.txt', 'a')

f.write('Windows Me\n')

datalist = ['Windows XP\n', 'Windows Vista\n']
f.writelines(datalist)

f.close()

# 演習7-1-1

歴代のmacOSのコードネームを分類ごとにテキストファイルに書き込め。

コードネーム一覧