Python では、別のテキストファイルや CSV ファイルなどの様々なファイルから、データを読み込んで、加工することができます。
これができるようになると、Pythonに素早くデータを取り込んで、分析や解析を行えるようになるので、ぜひ覚えておきましょう。
1. テキストファイル (.txt) の読み込み
ここでは、下図の “Hello World!” というテキストを書いたファイル(hello_world.txt)を例に解説します。
Python で、このようなテキストファイルを読み込むには、以下の 3 つの操作を行います。
- open() 関数でテキストファイルを開く
- read() メソッドでテキストデータを読み込む
- close() メソッドでテキストファイルを閉じる
最初に、実際の簡単なコードを見てみましょう。
'''open()関数でファイルを開きます。'''
fileobj = open("hello_world.txt")
'''read()メソッドでファイルを読み込みます。'''
text = fileobj.read()
'''close()メソッドでファイルを閉じます。'''
fileobj.close()
'''変数 text には hello_world.text の中身が代入されています。'''
print(text)
このように、ファイルを開いてから、データを読み込み、そしてデータを閉じるということをワンセットで覚えておきましょう。
それでは、より詳しく見ていきましょう。
1.1. open() 関数でファイルを開く
open() は Python の組み込み関数です。以下が基本的な書式です。
open("ファイルパス", "モード" ,"エンコード")
open 関数では、それぞれの引数を、クオートで区切る必要があることを覚えておきましょう。最初は忘れる人が多いのでご注意ください。このうち、必須の引数はファイルパスだけで、他のものは省略することができます。
この関数の戻り値は、「ファイルオブジェクト型」となり、read() メソッドや write() メソッドを使うことができます。
それでは見ていきましょう。
1.1.1. ファイルパス
ファイルパスは、コンピュータのどこにファイルがあるのかを表す住所のようなものです。住所を正確に入力しなければ、Python は、該当のファイルを見つけることができません。
例えば、例として、次のようなファイルパスがあるとします。
/Users/moriyamahiroaki/Documents/python/hello_world.txt
これは、読み込みに使用した hello_world.txt が、下図のように、Users の moriyamahiroaki の Documents ファイルの中にある python フォルダ下にあることを示しています。
このように、ファイルパスは、フォルダ毎に / で区切って表記します(Windows では \ で区切ります)。
なお、ファイルパスは、基本的には手書きでは書きません。対話シェルに該当のファイルをドラッグ&ドロップしたら、表示してくれますので、それをコピー&ペーストしましょう。
1.1.2. モード
モードは、open() 関数でファイルを開いて、読み込みたいのか、書き込みたいのかといった目的ごとに指定します。
主に使うのは以下です。
モード | 解説 |
“r” | 読み込み専用で開く(デフォルト)。書き出しは不可。 |
“w” | 書き出し専用に開く。ファイルが存在する場合は上書きし、まだない場合は新しいファイルを作る。読み込みは不可。 |
“w+” | 読み書きの両方ができるように開く。ファイルが存在する場合は上書きし、まだない場合は新しいファイルを作る。 |
“a” | 書き込み用に開く。ファイルが存在する場合は追記する。 |
これらは、ファイルパスに続けて、第二引数に、次のように書きます。
#読み込み専用
open("hello_world.txt", "r")
#書き出し専用
open("hello_world.txt", "w")
#読み書き両方
open("hello_world.txt", "w+")
または、次のように、キーワード引数(mode = “”)を指定して書くこともできます。
#読み込み専用
open("hello_world.txt", mode="r")
#書き出し専用
open("hello_world.txt", mode="w")
#読み書き両方
open("hello_world.txt", mode="w+")
なお、モードを指定しない場合のデフォルト値は “r” です。
上の表の中でも書いていますが、”r” は読み込み専用で、書き出しはできません。一方、”w” は書き出し専用のため、読み込みはできません。つまり、前者は、read() メソッドは使えますが、write() メソッドは使えません。後者は、その反対になります。”w+” では、両方を使うことができます。
1.1.3. エンコード
エンコードとは、ファイルの文字コードのことです。インターネットで、あるサイトにアクセスした時に、文字化けしていたという経験をしたことはないでしょうか?あれは、サイトの文字コードと、あなたのパソコンで設定されている文字コードが異なることが原因です。
それと同じで、もし、ファイルの文字コードと、エンコードの指定が合っていない場合は、エラーになって読み込むことはできません。
代表的な文字コードは、次の 2 つでしょう。
エンコード | 解説 |
“utf_8” | UTF8。世界中の文字を扱うことができて、世界のソフトウェアの共通語。 |
“shift_jis” | ShiftJIS。日本語を扱うことができる。UTF8では使えないような珍しい漢字も扱うことができる。 |
世界中で、UTF8 が使われているので、基本はこれで問題ないでしょう。
encode 引数は、モードに続けて、次のように書きます。
open(ファイルパス, "r", encoding="utf_8")
encode 引数を指定しない場合は、現在の設定(プラットフォーム)と同じになります。現在のプラットフォームの文字コードは、locale モジュールをインポートして、次のコードで確認することができます。
#現在のプラットフォームの文字コードを確認する。
import locale
locale.getpreferredencoding(False)
上述のように、UTF8 がほとんどなので、あまり使う場面は多くありません。しかし、ファイルの読み込みや書き出しで、何らかの不具合があった場合は、文字コードに原因があるかもしれませんので、覚えておきましょう。
1.2. read() メソッドでテキストを読み込む
read() メソッドは、open() 関数で作成したファイルオブジェクトを読み込むメソッドです。次のように使います。
#open関数でファイルを開いて、変数 fileobj に代入する。
fileobj = open("hello_world.txt")
#ファイルオブジェクトに対して read() メソッドを使う。
text = fileobj.read()
print(text)
これは簡単ですね。なお、通常は、ファイルから読み込んだデータは、別の変数などに代入して使います。
また、上述の通り、書き出し専用で開いたファイルに対しては、read() メソッドを使うことはできません。
#書き出し専用モードで開く。
fileobj = open("samle.txt", "w")
#書き出し専用のファイルオブジェクトに read() メソッドは使えない。
fileobj.read()
このようにエラーになります。
1.3. close() メソッドでファイルを閉じる
最後に、open() 関数で開いたファイルは、close() メソッドを使って必ず閉じるようにします。もし、他のところで、ファイルを開いたりすると、予期せぬ変化が起きて混乱してしまうからです。
close() メソッドは、次のように使います。
fileobj.close()
繰り返しになりますが、開いたファイルからデータを読み込んだら、そのデータを操作する前に、必ずファイルを閉じる癖をつけておきましょう。
2. with as 文で自動でファイルを閉じる
open() で開いたファイルオブジェクトを閉じ忘れることはよくあります。ファイルを閉じ忘れたままでは、後で面倒なエラーが起こりやすくなります。
そこで、open() 関数でファイルを開く時に with as 文というものを使って、自動でファイルを閉じるようにすることができます。
これの基本書式は次の通りです。
with open("ファイルパス", "モード") as 変数名:
ステートメント
実例を見てみましょう。
with open("hello_world.txt", "r") as fileobj:
text = fileobj.read()
print(text)
この方法を使えば、ステートメントが最後まで実行された後に、ファイルが自動的に閉じられるようになります。変数 text にファイルオブジェクトを代入しているので、そこからデータを操作することができます。
3. テキストファイルの様々な読み込み方
それでは、テキストファイルについて、いくつか様々な読み込み方を見て、さらに理解を深めておきましょう。
3.1. テキストファイルの中の文字列を指定の文字数だけ読み込む
read() メソッドの引数で、ファイルから読み込む文字数を指定することができます。次のコードをご覧ください。
with open("hello_world.txt", "r") as fileobj:
text = fileobj.read(5)
print(text)
簡単ですね。
3.2. テキストファイルの中の文字列の単語リストを作る
with as 構文を使って、hello_world.txt の中の文字列を、単語ごとに区切って、リスト化してみましょう。
with open("hello_world.txt", "r") as fileobj:
text = fileobj.read()
wordlist = text.split(" ") #split メソッドで空白毎に区切ってリスト化する。
print(wordlist)
このコードの中で使っている split() メソッドは、文字列型オブジェクトを、指定の区切り文字で区切ってリスト化するメソッドです。これは、「Pythonの文字列を分割する方法まとめ」で解説しています。
3.3. テキストファイルの中の文字列を一行ずつ読み込む
readline()メソッドを使うと、テキストファイルの中の文字列を一行ずつ読み込むことができます。ここでは、次のファイル『peter_piper.txt』を例に解説します。
このファイルから、一行ずつ、文字列を読み込んでみましょう。
with open("peter_piper.txt") as fileobj:
line1 = fileobj.readline()
line2 = fileobj.readline()
line3 = fileobj.readline()
line4 = fileobj.readline()
print(line1)
print(line2)
print(line3)
print(line4)
簡単ですね。
3.4. ファイルオブジェクトをイテレータとして使う
open() 関数で読み込んだファイルオブジェクトはイテレータです。そのため、イテレータに対する様々な操作を行うことができます。ここでは、そうした操作例を見てみましょう。
イテレータについては、「Pythonのイテレータとジェネレータの使い方まとめ」をご覧ください。
文字列型のイテレータに next() 関数を使うと、文字列を一行ずつ取り出すことができます。次のコードをご覧ください。
with open("peter_piper.txt") as fileobj:
print(next(fileobj))
print(next(fileobj))
print(next(fileobj))
print(next(fileobj))
これを使うと、次のようなコードも書くことができます。
with open("peter_piper.txt") as fileobj:
while True:
try:
line = next(fileobj) #イテレータから一行取り出す。
if line.find("that") >=0:
print("'that' が見つかりました。")
print(line)
break
except StopIteration:
print("'that' は見つかりませんでした。")
break
find() メソッドは、「Pythonの文字列の検索で知っておくべき方法まとめ」で解説しています。
4. CSVファイルの読み込み
Pythonの組み込みモジュールを使えば、CSVファイルも扱うことができます。CSVファイルは、中身のデータがカンマで区切られているもので、Comma Separated Values の省略形です。データ分析を行いたい時に、よく用いられます。
読み込み方法は、テキストファイルの時と変わりません。以下の例をご覧ください。
with open("seo_keywords.csv") as key:
fileobj = key.read()
print(fileobj)
読み込んだCSVファイルのデータに対して、csv モジュールの機能を使うことで、様々な加工を行うことができます。
次の例は、csv.reader() メソッドを使って、データを一行ずつリスト化しています。
import csv #csvモジュールのインポート
'''csv.reader() メソッドでデータをリスト化します。'''
with open("seo_keywords.csv") as key:
for i in csv.reader(key): #csv.reader() は、ファイルをcsvオブジェクトに変換する関数です。
print(i)
次のように、一行目のデータを辞書のキーに、二行目以降のデータを辞書の値にして、辞書化することもできます。
import csv #csvモジュールのインポート
'''csv.DictReader()メソッドでデータを辞書化します。'''
with open("seo_keywords.csv") as f:
for i in csv.DictReader(f):
print(i)
5. メニューでファイルを選択して読み込む
よく会員登録メニューや、採用応募メニューで履歴書などのファイルを、パソコンの中から選んで貼り付けるものがありますね。そうしたものを「オープンファイルダイアログ」と言います。それと似たような形で、読み込むファイルを、パソコンの中から選ぶようにすることができます。
そのためには、tkinter モジュールという、GUI(グラフィカル・ユーザー・インターフェイス)を作ることができるモジュールを利用します。
次のコードをご覧ください。
'''tkinter モジュールをインポートします。'''
import tkinter as tk
import tkinter.filedialog as tkfd
'''tkアプリウインドウを表示しないコードです。'''
root = tk.Tk()
root.withdraw()
'''オープンダイアログを表示するコードです。'''
file = tkfd.askopenfilename(
title = "ファイルを選びましょう。",
filetypes =[("TEXT", "txt"), ("TEXT", ".py"), ("HTML", ".html")] #開けるファイルの種類。
)
'''ファイルが選択された時に開くようにするコードです。'''
if file:
with open(file, "r") as fileobj:
text = fileobj.read()
print(text)
モジュールについては、「Pythonのモジュールについて抑えておくべき知識とよく使うもの一覧」で解説しています。tkinterモジュールについては、Python の公式ドキュメントを確認してみてください。root で始まる 2 つの文は、tkアプリウインドウを開かないようにするものです。そこからでも、開くファイルを選択することはできますが、真っ白い小さなウインドウが表示されるので実用的ではありません。
さて、これを実行すると、下図のように、オープンファイルダイアログが開きます。
ファイルを選んで開くと、ファイルパスが返ってくるので、それを変数 file に代入しています。最後に if 文の中に、with as 構文を書いて、open()関数と read() メソッドを使っています。ここを if 文にしているのは、もしオープンファイルダイアログでキャンセルを選ぶと、変数 file にファイルパスが入らず、エラーになってしまうからです。
ここでは、上で使用していた、hello_world.txt を読み込んだので、実行結果には、 hello world! と表示されていますね。
6. まとめ
繰り返しですが、Python でファイルを読み込む時は、
- open() 関数でテキストファイルを開く
- read() メソッドでテキストデータを読み込む
- close() メソッドでテキストファイルを閉じる
をワンセットで覚えておきましょう。
特に、close() メソッドでファイルを閉じ忘れることが最初は多いと思います。ファイルを閉じ忘れると重大なエラーに繋がるので、必ず癖づけておきましょう。with as 構文を使うと、自動でファイルを閉じてくれるようになるので、こちらを使うのも良いでしょう。
コメント