Python

PythonでTEXTを操作!読み込みから書き込みまでの基本

2021年9月4日

Pythonでテキストファイルの操作

Pythonを使ったテキストを操作するために、読み込みから書き込みといった使い方を解説します。

読み込みに関しては、1行ずつ読み込んだり読み込んだファイルをリスト化したりといった手法もサンプルコードを元に説明しています。

他にもPythonでいろいろなファイルの読み書きを解説しています。

ご興味があれば、下記の記事もご覧ください。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

テキストファイルの読み込み

テキストファイル読み込み

テキストファイルを読み込むには、3つの使い方があります。

1つ目は、1行ごとに読み込む使い方。

2つ目は、ファイルを全部をリスト化する使い方。

3つ目は、ファイルを文字列として読み込む使い方です。

読み込み方法

  • 1行ごとに読み込む(readline関数)
  • ファイル全体をリスト化(readlines関数)
  • ファイルを文字列として読み込む(read関数)

ファイルを読み込むためには、ファイルを開く必要があります。

ファイルを開くには、openを利用します。

Open(ファイル名, mode=オプション)

第1引数にはファイル名を入れます。

第2引数にはオプションを指定しますが、読み込みのオプションは「r」になります。

モードのオプションについては、デフォルトがrなので省略しても問題ないです。

他にもエンコーディングを設定することで、UTF8やシフトJISといった読み込みができます。

エンコーディングは、引数にencodingをつけて書きます。

Open('sample.txt', 'r', encoding='utf_8')

ちなみに、このコードを実行するとエラーになります

エラー内容は、「No such file or directory」として、sample.txtが無いというエラーです。

エンコーディング

  • utf_8
  • shift_jis
  • euc_jp
  • iso2022_jp
  • ascii

他のサイトではUTF-8やutf-8といったエンコーディングの書き方があったりしますが、Pythonのopenの正式な書き方は、utf_8になるので気をつけてください。

1行ごとにファイルを読み込む

ファイルを1行おきに読み込むには、readline関数を利用します。

読み込むテキストファイルは、下記になります。

このデータは、テキスト読み込みのサンプルです。
Pythonでファイルを読み込むには3つ読み込み方がある。
読み込んだら閉じるは、どの言語でやること。

このサンプルを使って実際に読み込んでみます。

f = open('./sample.txt')
print(f.readline())
f.close()

このサンプルの結果は下記になります。

このデータは、テキスト読み込みのサンプルです。

readline関数を呼び出すごとに、次の行へ移動していきます。

そのため下記の様にwhileで書くことで、全行をループして取得することができる。

f = open('./sample.txt')
line = f.readline()
while line:
    print(line.strip())
    line = f.readline()

f.close()

do whileに近い書き方ですね。

strip関数は、行の前後の改行文字やタブを除去する関数になります。

結果は下記になります。

このデータは、テキスト読み込みのサンプルです。
Pythonでファイルを読み込むには3つ読み込み方がある。
読み込んだら閉じるは、どの言語でやること。

ファイル全体をリストにして読み込む

ファイル全体を読み込んで1行ごとにリスト化するには、readlines関数を利用します。

f = open('./sample.txt')
all = f.readlines()
for line in all:
    print(line.strip())

f.close()

結果としては、1行と同じですがreadlinesは全体をリスト化したデータを返しており、forで全データをループさせています。

ファイルを文字列として読み込む

ファイル全体を文字列として読み込むには、read関数を使います。

リスト化のreadlinesと違うのは、戻り値が文字列になります。

f = open('./sample.txt')
print(type(f.read()))      # <class 'str'>
print(type(f.readlines())) # <class 'list'>
f.close()

readの戻り値は、読み込んだファイルのデータ全てが文字列になります。

テキストファイルの書き込み

テキストファイル書き込み

Pytonでテキストファイルを書き込むには、write関数を使います。

他にもリスト単位で書き込むwritelinesという関数もあります。

しかし、ファイルの書き込みで重要なものは、オプションの指定になります。

オプションによって、新規作成で上書きなのか追記なのか分かれてきます。

新規作成または上書き

新規作成や上書きするには、オプションにwを使います

基本的には読み込みと同じで、open関数を使ってオプションのモードをwを指定するだけです。

f = open('./write.txt', 'w')
f.write('テストです' + '\n')
f.close()

write.txtというファイルが無ければ作成されます。

もしあった場合は、内容が「テストです」として書き込まれます。

リストごとに書き込み

書き込みの冒頭でも話したとおり、リストを書き込むにはwritelines関数を使います。

list = ['テスト\n', 'あいうえお\n']
f = open('./write.txt', 'w')
f.writelines(list)
f.close()

writelinesにリストをセットすることで、write.txtには下記の内容で書き込まれます。

テスト
あいうえお

モードXによる作成

open関数のモードオプションにxを指定するとどうなるのか。

答えは、ファイルが存在しない場合は作成されます。

しかし、ファイルが存在するとエラーが起きます。

下記は、リストを書き込むセクションで使ったコードになります。

list = ['テスト\n', 'あいうえお\n']
f = open('./write.txt', 'x')
f.writelines(list)
f.close()

実行するとエラーになります。

FileExistsError: [Errno 17] File exists: './write.txt'

FileExistsErrorが表示され、すでに存在しているというエラー内容になっています。

先頭に追加

先頭行に文字を追加するには、いろいろなやり方があります。

ライブラリを使ったり、読み込みでファイルを開いて書き込み用で再度開く方法です。

しかし、ライブラリや2回もopen使う理由ある?って思いました。

モードのオプションにr+とseekとinsert関数を使えばコードを減らすことができます。

まずは、openを2回使う方法です。

f = open('./write.txt', 'r')
str = f.read()
f.close()

l = '先頭行に追加\n'
f = open('./write.txt', 'w')
f.write(l + str)
f.close()

1回目のopenは読み込みモードで、2回目は書き込みモードでファイルを開いています。

読み込み時にはread関数を使っていますが、writelines関数を使うことでコードの可視性が上がりスッキリさせることができます。

下記がseek関数とinsertを使った一つのopenによるやり方です。

data = '先頭行に追加\n'
f = open('./write.txt', 'r+')
all = f.readlines()
all.insert(0, data)
f.seek(0)
f.writelines(all)
f.close()

このコードは、r+で読み書き可能なモードでファイルを開いています。

readlines関数で各行をリスト化して、insertを使ってリストの先頭行にデータを追加しています。

あとは、seekで0を指定することで先頭から書き込む処理をしています。

seekは行ではなく、文字数の位置から書き込むので注意が必要です

途中に書き込み

どの行に書き込むかを考えずに、何行目に書き込む処理はカンタンです。

例えば3行目に入れたいとかであれば下記のコードで十分です。

このコードは、先頭に追加のセクションで説明しています。

data = '3行目に追加\n'
f = open('./write.txt', 'r+')
all = f.readlines()
all.insert(2, data)
f.seek(0)
f.writelines(all)
f.close()

insert関数で、2を設定すると3行目に文字を書き込むことができます。

3行目なのに2を設定している理由は、リストの番号が0から始まるので、0、1、2、で2が3番になるからです。

あと上記のコードで、リストが一つもない場合はエラーになるのか試してみました

空っぽのリストにインデックスをしていたインサートをした場合、エラーにならずにそのまま追記される。

with構文

with構文を使うことで、ファイルを開いたら閉じる処理を省略することができます。

withを使わない場合だと、下記の様にclose()をします。

f = open('./sample.txt', 'r', encoding='utf_8')
print(f.readline())
f.close()

しかしwithを使うことで閉じる処理を省略することができます。

with open('./sample.txt') as f:
    print(f.readline())

as で戻り値の変数を定義します。

そうすることで、ブロックの中で戻り値を利用することができます。

with構文を使っていれば、閉じ忘れがあっても安心できますね

空のファイルを作る2つの方法

空のファイルを作る方法は複数ありますが、withとopen・closeのやり方を紹介します。

openとcloseを使ったやり方

open('empty.txt', 'w').close()

ファイルをオープンしてチェーンメソッドでクローズすることで、1行で空のファイルを作成しています。

次にwithを使ったやり方です。

with open('empty.txt', 'w') as f:
    pass

withの場合は1行で書くことはできません。

ブロックの中には、必ず何かコードを書く必要があります。

そのため、回避策としてpassというコードを入れて回避する必要があります。

どちらにするかは、仕様で決めておくか好みですね。

ファイルの存在チェック

ファイル存在チェック

ファイルの存在チェックをするには、exists関数またはisfile関数を利用します。

この2つの関数は、osモジュールの中にあります。

exists関数

exists関数は、ファイルやディレクトリ(フォルダ)の両方をチェックします。

そのため、ファイルだけをチェックしたい場合はisfile関数を利用した方が良いです。

if os.path.exists('./empty.txt'):
    print('ファイルあるよ')
else:
    print('ファイルないよ')

isfile関数

isfileの場合は、ファイルの有無をチェックすることができます。

if os.path.isfile('./empty.txt'):
    print('ファイルあるよ')
else:
    print('ファイルないよ')

まとめ

Pythonでファイルの読み書きについては、標準の機能でも問題なく使えます。

他の言語だと、若干使いづらいためにライブラリを入れたりすることもありますが、Pythonは標準機能でも十分使えます。

しかし、膨大な量のデータを読み書きするには試していないので、検証については今後紹介できるにします。

他にもPythonでいろいろなファイルの読み書きを解説しています。

ご興味があれば、下記の記事もご覧ください。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

Udemyへ

今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?

-Python
-,