横浜国立大学理工学部建築都市環境系学科卒
一級鉄筋技能士
pythonに限らず、プログラム言語ではテキストファイルの操作をすることが多いです。
テキストファイルはsample.txtなど「.txt」が付いたものが一般的ですが、他の拡張子でもファイルの中に文字データがあればテキストファイルとして扱います。
今回はpythonでのファイル操作について習得していきましょう。
目次
テキストファイル読み込み
テキストファイルの読み書きはopenを使っていきます。
下記内容をsample.txtというファイル名で、コードと同じ場所に保存して動かしていきます。
1 2 3 |
Hello World !!! |
openメソッド、readメソッド、closeメソッド
使い方は簡単で、3ステップです。
- openの引数にファイルのパスを入れ、ファイルオブジェクトを変数に取得
- ファイルオブジェクトのreadメソッドを使って、文字データを読み込み
- ファイルオブジェクトをcloseメソッドを使って閉じる。
メソッドは関数のようなもので、違いはあるのですが、処理がまとまっている点は同じです。
1 2 3 |
f = open('sample.txt') txt = f.read() f.close |
with構文でcloseメソッドを自動的に処理する
ファイル操作ではopenで開いて、closeで閉じましたが、閉じ忘れるとファイルが開いたままで放置されてしまいます。
閉じ忘れ防止のためにもwith構文を使います。
withを使うと勝手にclose処理をしてくれます。
- with構文でopenを使い、変数にファイルオブジェクトを入れる
- ファイルオブジェクトのreadメソッドを使って、文字データを読み込む
f=open()としていたものを、with open() as fとするだけです。
forやifのように、インデントが必要になるので、忘れずに入れておきましょう。
1 2 |
with open(path) as f: txt = f.read() |
printを使って、読み込んだ内容を確認しましょう。
1 |
print(txt) |
1 2 3 |
Hello World !!! |
データが読み込めました。
日本語の文字化けは文字コードが原因
文字データを取り扱うと、文字コードというものが出てきます。
Windowsのメモ帳を開くと右下に文字コードが表示されています。
文字データと取り扱った時に、日本語の文字化けがでれば、この文字コードが原因です。
その場合、文字コードが一致していない可能性があります。
文字コードの指定は、引数にencodingを追加します。
1 2 |
with open('sample.txt', encoding='utf-8') as f: txt = f.read() |
encodingを省略すると、OSに依存した文字コードを選択してくれます。
readlinesメソッドで1行ずつ処理する
テキストファイルのデータは1行ずつ処理することが多いので、1行ずつ処理する方法を紹介します。
今まで、readメソッドを使ってきましたが、readlinesメソッドを使うと、1行ずつに分けてリストで取得できます。
1 2 3 |
with open('sample.txt') as f: txt_list = f.readlines() print(txt_list) |
1 |
['Hello\n', 'World\n', '!!!'] |
\nは改行を表しています。
リストというのは、配列と呼ばれる複数の値を持てる変数です。
txt_listには下記のように3つの値がまとめて入っています。
取り出す場合は、txt_list[配列No]とすることで取り出せます。
配列Noは0から始まるので、慣れてない方は注意が必要です。
1 2 3 |
print(txt_list[0]) print(txt_list[1]) print(txt_list[2]) |
1 2 3 4 5 |
Hello World !!! |
データが少なければ、これでも良いですが、大量のデータの場合はfor文で処理を繰り返します。
リストをfor文繰り返す場合、for 変数 in リスト:を使い、次のようになります。
1 2 3 4 |
for s in txt_list: # 何らかの処理 今回は右の改行文字「\n」を削除 s = s.rstrip() print(s) |
変数のsにはtxt_listの中身が順番に取り出され、なくなるまで繰り返されます。
今回は、rstripメソッドを使って右端の改行を削除する処理をしていますが、必要な処理を入れることになります。
テキストファイルの書き込み
次にテキストファイルの書き込みです。
文字データを処理して、別のファイルに書き込む時などに使います。
プログラムの書き込み構文は読み込みとほとんど同じ
プログラムの構文は読み込みとほとんど同じです。
- with構文でopenを使い、引数にmode=’w’を渡し、変数にファイルオブジェクトを入れる
- ファイルオブジェクトのwriteメソッドを使って、文字データを書き込む
mode=’w’が読み込みと違うところですが、読込の時は省略しているだけで、省略時にはmode=’r’となっています。
実際に、コードで書いてみましょう。
1 2 |
with open('sample2.txt', mode='w') as f: f.write('Hello world!!!') |
これを実行すると、コードと同じフォルダにsample2.txtができます。
modeの種類
modeが出てきましたが、これにはいくつか種類があります。
mode | 機能 |
---|---|
r | 読み込み。 |
w | 書き込み。ファイルがある場合は、そのまま上書きされる。 |
x | 書き込み。ファイルがない場合のみファイルが作成され、ファイルがあるとエラーが発生。 |
a | 書き込み。ファイルがある場合は、元あるデータの末尾に書き込む文字が追加されていく。 |
書き込みにも用途が三種類用意されていますので、用途に合わせて使っていきましょう。
例えば、ログとかであれば、データをどんどん末尾に追加したいので、mode=’a’を選ぶと良いでしょう。
複数行の書き込みはwriteメソッドを使用する
大抵は、1行で書き込みたいということはなく、複数行を書き込むことが多いので、
その方法を説明していきます。
例えば、次のようなリスト(配列データ)を書き込みます。
1 |
txt_list = ['Hello', 'World', '!!!'] |
リストは上記のように[データ1 , データ2, データ3 , …. ,データn ]と角括弧([])の中にカンマ(,)区切りでデータを入れると作ることができます。
このデータを1つずつ書き込みます。
読み込みではreadlinesを使ったので、writelinesとなりそうですが、このメソッドを使うと複数行にならないので、writeメソッドを使っていきます。
まずはシンプルにfor文で繰り返して書き込んでみましょう。
1 2 3 4 |
with open('sample2.txt', mode='w') as f: for s in txt_list: # 取り出した文字列の後ろに改行文字('\n')を追加して書き込む f.write(s+'\n') |
txt_listの中身を1つずつ取り出して、末尾に改行文字を追加して、書き込んでいます。
実行すると、sample2.txtに下記が書き込まれます。
1 2 3 |
Hello World !!! |
writeメソッドを繰り返すことで、何度も書き込み処理を実行します。
この他の方法として、リストのデータを一旦書き込む文字列にしてから、書き込む方法があります。
まず、文字列のjoinメソッドを使うとリストのデータを指定する文字で連結することができるので、連結した文字を作ります。
今回は改行文字「\n」で連結したいので、次のようなコードになります。
1 |
'\n'.join(txt_list) |
1 |
'Hello\nWorld\n!!!' |
‘\n’の文字列でjoinメソッドを呼び出し、引数にtxt_listを渡しています。
このデータを書き込めば、複数行のデータに分かれて書き込むことができます。
次のようになります。
1 2 |
with open('sample2.txt', mode='w') as f: f.write('\n'.join(txt_list)) |
for文を使った書き込みと違って、こちらの方が高速で書き込むことができます。
まとめ
機械学習ではCSV、エクセルなどの表データを使うことが多いです。
CSVもテキストファイルの一種ですし、テキストファイルのデータを取り扱う場面も多いので、しっかり習得していきましょう。