プログラミングにおいて、あらゆる形式のファイルの内容を読み込む処理はよく使われます。
CSVファイルを読み込む方法が知りたい
日本語を含むファイルを読み込む方法が知りたい
バイナリファイルの読み込む方法が知りたい
そこで今回は、Pythonにおける「ファイルの読み込み」に関して、やさしく解説していきたいと思います。
- 【基礎】txtファイルの読み込み方法
- 【基礎】with文を活用する方法
- 【基礎】csvファイルの読み込み方法
- 【発展】日本語を含むファイルの場合
- 【発展】バイナリの読み込み方法
- 【発展】リストや辞書に書き込み方法
この記事を読めば、ファイルを読み込む方法について一通り理解することができます。
ぜひご覧ください!
※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
txtファイルの読み込み
まずは基本的なファイルの読み込み方法をご紹介したいと思います。
ファイルと言っても、様々な形態のファイルが存在します。まずは、一番一般的で基本であるtxtファイルを読み込んでみましょう。
これから紹介するサンプルコードでは以下の「start.txt」を使用しています。
Hi everyone! This is Samurai Engineer blog. Let's enjoy programming!
読み込む際に使用するメソッドは主にreadとreadlines です。
ではまずは、readメソッドを使用したサンプルコードをご覧ください。
myfile = open("start.txt") data = myfile.read() myfile.close() print(data)
出力結果は以下の通りです。
Hi everyone! This is Samurai Engineer blog. Let's enjoy programming!
上のコードでは、
- open関数でstart.txtを開く(ファイルオブジェクトを返す)
- readメソッドでデータを読み込み
- data変数にその内容を格納
の処理をしています。
読み込みが完了したmyfileはもう必要ないので、close関数で閉じておきます。出力結果を見てわかるように、readメソッドはファイル全体を文字列型として読み込みます。
反対に、readlinesメソッドはファイルを一行ごとに読み込み、各行がリスト型オブジェクトの要素を構成しています。
以下のコードをご覧ください。
myfile = open("start.txt") data = myfile.readlines() myfile.close() print(data)
出力結果は以下の通りです。
['Hi everyone!n', 'This is Samurai Engineer blog.n', "Let's enjoy programming!"]
上のコードは、先ほどのコードとさほど変わりません。
readメソッドがreadlinesメソッドに変わったくらいですが、出力結果が文字列ではなく、リスト型オブジェクトであることがわかります。各行を抜き取りたい場合は、いつものようにforループを使用しリスト型オブジェクトの要素を取り出しましょう。
また、その際にrstripメソッドを使用して改行「n」を取り除くことも出来ます。forループについての基本的な解説は以下のリンクを参照してください。
with文を活用する方法
これまで紹介してきたファイルの読み込み方法は、
- open関数でファイルを開き
- readメソッドやreadlinesメソッドで読み込み
- そしてclose関数で終了
という形をとっていました。
しかし、with構文を使うとこれらがとっても簡潔化されて便利になります。
以下のサンプルコードをご覧ください。
with open('start.txt', 'r') as f: for line in f: print(line)
fはファイルオブジェクトです。
ファイルオブジェクトをそのままfor文で使うと、一行ずつ文字列として取り出してくれます。
出力結果は以下の通りです。
Hi everyone! This is Samurai Engineer blog. Let's enjoy programming!
上のコードでは、with文を使用してファイルの読み込みを行いました。
- withブロック内はファイルが開いている状態
- ブロック外はファイルが閉じられている状態
になります。
その為、close関数を使用する必要が無くなりました。ちなみに、start.txtの横にある「r」という文字は「読み取り専用モード指定」です。
単純に、start.txtは「新たなデータを書き込むためではなく、読み込むために開いています」という意味です。
csvファイルの読み込み
txtファイルの他にも、csvファイルなどもよく使用するテキストファイルの種類です。csvファイルはカンマで区切られたデータのことです。
今回は、csvファイルからデータを1つずつ読み取る方法をご紹介したいと思います。これから紹介するサンプルコードでは、以下の「start.csv」を使用しています。
Japan,Tokyo,Osaka,Sapporo Italy,Roma,Firenze,Venice UK,London,York,Wales
以下のサンプルコードをご覧ください。
with open('start.csv', 'r') as f: for line in f: elements = line.split(',') for element in elements: print(element)
出力結果は以下の通りです。
Japan Tokyo Osaka Sapporo Italy Roma Firenze Venice UK London York Wales
上のコードでは、csvファイルのデータを一行ずつ読み込んでいます。
splitメソッドの引数に「’,’」(カンマ)を指定しているのは、各行の要素(Japan, Tokyo, Osaka, Sapporo)がカンマで区切られているためです。
splitメソッドの戻り値はリスト型オブジェクトなので、各データはforループを使って抽出されています。
日本語を含むファイルの読み込み
日本語の文字列が含まれるファイルは、読み込み時に文字化けする場合があります。それを回避するためには、このようにopen関数の引数に文字コードを指定する必要があります。
encoding=’UTF-8’
このencodingに読み込みたいファイルと同じものを指定します。
読み取るファイルの文字コードとopen関数で指定する文字コードが異なれば、UnicodeDecodeErrorエラーが発生するので、十分注意しましょう。
日本語で構成されているcsvファイルを読み込んでみましょう。
使用するcsvファイルは以下のものです。
日本,東京,大阪,札幌 イタリア,ローマ,フィレンツェ,ヴェネツィア イギリス,ロンドン,ヨーク,ウェールズ
以下のサンプルコードをご覧ください。
with open('japan.csv', encoding='UTF-8') as f: for line in f: elements = line.split(',') for element in elements: print(element)
出力結果は以下の通りです。
日本 東京 大阪 札幌 イタリア ローマ フィレンツェ ヴェネツィア イギリス ロンドン ヨーク ウェールズ
バイナリファイルの読み込み
これまでご紹介してきたのは全てテキストファイルを読み込む方法です。
しかし、バイナリ(2進数)ファイルを読み込みたい場合はどうすれば良いのでしょうか。以下のコードをご覧ください。
with open("test.bin","rb") as f: f.seek(0)
上のコードでは、test.binというバイナリファイル「rb」モードで開いています。
これは「バイナリファイルを読み取り専用で開きます」という意味です。seekメソッドは指定した場所からデータを読み始めることが出来るとても便利なメソッドなので覚えておきましょう。
リストや辞書に書き込む
csvファイルを読み込んだ後、リストや辞書型オブジェクトなどに書き込む、ということも覚えておくと便利です。
Pythonにはcsvモジュールといったものが用意されています。これを使用すると簡単な記述でリストや辞書に抽出したデータを格納することができます。
csvモジュールを使用するには、まずはインポートをする必要があります。csvモジュールをインポートするには以下のコマンドを使用してください。
import csv
ではまずは、リスト型オブジェクトにデータを格納してみましょう。
これからご紹介するコードでは、先ほどと同じように「start.csv」を使用します。
以下のサンプルコードをご覧ください。
with open('start.csv', 'r') as f: reader = csv.reader(f) for row in reader: print(row)
出力結果は以下の通りです。
['Japan', ' Tokyo', ' Osaka', ' Sapporo'] ['Italy', ' Roma', ' Firenze', ' Venice'] ['UK', ' London', ' York', ' Wales']
上のコードでは、csvモジュールのreaderメソッドを使用しています。csvファイルの各行がリストになっており、その行に属するデータたちがリストの要素となっています。
では、今度はcsvファイルのデータを辞書に書き込んでみましょう。使用するcsvファイルは以下のものです。
Country_name,Capital_city,Other Japan,Tokyo,Osaka USA,Washington,NewYork
では、以下のコードをご覧ください。
with open('dict.csv', 'r') as f: reader = csv.DictReader(f) for row in reader: print(row)
出力結果は以下の通りです。
OrderedDict([('Country_name', 'Japan'), (' Capital_city', ' Tokyo'), (' Other', ' Osaka')]) OrderedDict([('Country_name', 'USA'), (' Capital_city', ' Washington'), (' Other', ' NewYork')])
上のコードでは、csvモジュールのDictReaderクラスを使用します。読み込むファイルの一行目が辞書のkeyとなり、2行目以降のデータをひとつずつ取り出し、それらを辞書のvalueとしてkeyに紐づけています。
ご覧いただけるように、一行目の一番目の要素であるCountry_nameは、きちんと二行目の一番目であるJapanや、三行目の一番目であるUSAと組み合わさっています。
まとめ
今回は、Pythonにおけるファイルの読み込み方法をまとめてご紹介しました。
txtファイルやcsvファイル、バイナリファイルなどといった様々な種類のファイルを扱えるととても便利です。ぜひ皆さんもこれらの扱い方をどんどんマスターしていってくださいね!