【Python】ファイルを開いて閉じる。open関数の使い方【入門第55回】

174, 2019-09-15

目次

Pythonでファイルを開くには?

こんにちは、narupoです。

今回はファイル操作の基本、ファイルを開いて閉じる方法を解説します。
ファイルを開けるようになると、ファイルを利用したプログラミングが出来るようになります。
この記事をとっかかりに覚えてみましょう。

具体的には↓を見ていきます。

  • ファイルの開き方

  • ファイルオブジェクトの受け取り方

  • ファイルの閉じ方

  • with文を使ったファイルの開閉

  • ファイルのモード

  • ファイルのエンコーディング

  • ファイルと例外

ほかのファイル入出力についての入門記事は↓をご覧ください。

ファイルの開き方

Pythonでファイルを開くにはopen関数を使います。

open(ファイルのパス)

open関数の第1引数にファイルへのパスを渡すと、open関数はテキストファイルの読み込みモードでファイルを開きます
たとえば↓のようなファイルfoods.txtがあるとします。

チャーハン
青椒肉絲
エビチリ

このファイルfoods.txtを開くには↓のようにします。

open('foods.txt')

↑の場合ですが、これはスクリプトと開きたいファイルが同じ階層、つまり同じフォルダ内などにある場合です。
ファイルのパスを絶対パスで指定する場合はWindows環境では↓のようにします。

open('C:\\path\\to\\foods.txt')

Linux系では↓です。

open('/path/to/foods.txt')

相対パスでファイルを開きたい場合は↓のようにします。

open('.\\foods.txt')
open('..\\..\\foods.txt')

Linux系では↓です。

open('./foods.txt')
open('../../foods.txt')

相対パスの場合は、Pythonインタプリタを実行した階層がパスの基点になります
スクリプトファイルの位置が基点になるわけではないので間違えないようにしましょう。

ファイルオブジェクトの受け取り方

open関数はファイルを開くことに成功するとファイルオブジェクトを返します。
ファイルオブジェクトを変数に入れるには↓のようにします。

fin = open('foods.txt')

変数finがファイルオブジェクトです。

ちなみにfinというのはfile inputの略です。
これと対になるのが書き込みモードのfout, file outputの略ですね。
さらに読み書きモードではfp, file pointerという略もよく使われます。
ここら辺は慣用的な命名なので好きな名前を付けて頂いてもかまいません。

open関数はデフォルトではテキストファイルの読み込みモードでファイルを開きますが、そのファイルオブジェクトのタイプは、

fin = open('foods.txt')
print(type(fin))

↓のようになります。

<class '_io.TextIOWrapper'>

このオブジェクトのタイプはファイルを開くモードによって変わることがあります。

ファイルの閉じ方

open関数でファイルオブジェクトを開くと、そのファイルオブジェクトは開かれた状態です。
ファイルオブジェクトを閉じる、つまりファイルを閉じるにはファイルオブジェクトのメソッドcloseを使います。

fin = open('foods.txt')
fin.close()

↑のようにするとファイルを閉じることができます。

ファイルを「開いて、閉じる」というのはファイルを扱う時の基本です。
ファイルは開いたら必ず閉じるようにしましょう。

開いたファイルを閉じないと、プログラムでいろいろな不具合が起こることがあります。
ちゃんと閉じていないファイルに再びアクセスすると、ファイルが開きっぱなしなので再度ファイルを開けないなどの不具合や、ほかにもファイルを閉じないばかりに書き込み内容が反映されてなかったりなど、あまりいいことがありません。
なので繰り返しになりますが、ファイルは開いたら必ず閉じるようにしましょう。

with文を使ったファイルの開閉

closeメソッドでファイルを閉じないといけないことはわかりましたが、これがけっこう忘れがちになるのです。
そこでPythonではwith文というのが用意されています。
with文を使うと、ファイルオブジェクトのcloseメソッドを呼び出さなくてもファイルを自動的に閉じることができます。
with文は↓のようにして使います。

with open(ファイルのパス) as ファイルオブジェクト名:
    処理

たとえば↓のようにするとfoods.txtファイルを開くことができます。

with open('foods.txt') as fin:
    pass

with文のブロックが終わると、↑のファイルオブジェクトfinは自動的にクローズされます。
このようにwith文を使うとファイルを閉じ忘れるミスが少なくなります。
Pythonでファイルを扱う時はwith文を使うようにしましょう。

ファイルのモード

冒頭でopen関数はデフォルトではテキストファイルの読み込みモードでファイルを開くと解説しました。
このモードというのは、ファイルに特徴的なものでたとえば↓のようなモードがあります。

  • テキストファイルの読み込みモード(r または rt)

  • テキストファイルの書き込みモード(w または wt)

  • テキストファイルの追記モード(a または at)

このほかにもまだモードはありますが、今回はテキストファイルに限ったモードを紹介します。
open関数の引数modeにモードを指定すると、ファイルを開くときのモードを変更できます。
たとえばテキストファイルの読み込みモードでファイルを開く場合は

open('foods.txt', mode='r')
open('foods.txt', mode='rt')

などにします。
テキストファイルの書き込みモードでファイルを開くには

open('foods.txt', mode='w')
open('foods.txt', mode='wt')

で、テキストファイルの追記モードでは

open('foods.txt', mode='a')
open('foods.txt', mode='at')

です。

ファイルの読み込みモードというのは、ファイルからデータを読み込みたい場合に使います。
つまり、データは読み込むけど書き込みはしないよ、という時に使います。
いっぽうファイルの書き込みモードというのは、ファイルへデータを書き込みたい場合に使います。
これは、データを書き込むけど読み込みはしないよ、という時です。
追記モードと言うのは、ファイルの末尾へデータを追記したい場合に使います。
このほかにも読み書きが両方できる+モードというものもあります。

ファイルのエンコーディング

パソコンは基本的に01しか理解できません。
よってファイルも01で記述されています。
こういったファイルをバイナリーファイルと言います。
バイナリーは2値のことですね。

この01を合わせてビット(bit)と呼びます。
プログラミングではこのビットの並びをバイト(byte)という単位でよく扱います。
バイトはビットが8個並んでいるものです(厳密には8個じゃない場合もあります)。
たとえば↓のようにです。

00101110

バイト1つを指して1バイト、バイト2つで2バイトと表現します。
このバイトがいくつも並んでいるものを指してバイト列(bytes)と言います。
バイナリーファイルはバイトが並んでいるものなので、バイト列の集まりと言うことができます。

このバイナリーファイルをテキストの形式で保存したものをテキストファイルといいます。
つまり、バイトの並びがテキストの形式になっているファイルのことですね。
この「形式」のことをエンコーディングと言います。
たとえば「utf-8のエンコーディングで保存されたテキストファイル」という風に表現します。
これはファイルのバイトがutf-8という形式に従って並んでいるということです。

テキストファイルは通常、このエンコーディングを指定して保存されています。
エンコーディングはutf-8だったりcp932だったりいろいろありますが、最近のプログラミングではutf-8を使うのが一般的です。
よってファイルを開くときも、このエンコーディングを指定する必要があります。

このエンコーディングなんですが、openはデフォルトでは環境依存のエンコーディングでファイルを開こうとします。
Windowsならcp932、Linux系ならutf-8が多いはずです。

この環境依存のエンコーディングを確認するには↓のようなコードを書きます。

import locale

print(locale.getpreferredencoding())

Windows環境では↑のコードの実行結果は↓のようになります。

cp932

エンコーディングを手動で指定したい場合は、open関数の引数encodingにエンコーディングを指定します。

open(ファイルのパス, encoding=エンコーディング)

たとえばfoods.txtファイルをutf-8で開きたい場合は↓のようにします。

open('foods.txt', encoding='utf-8')

最近のエディターは、デフォルトでutf-8でテキストファイルを保存する仕様になってることが多いはずです。
しかしWindows環境のデフォルトのエンコーディングはcp932です。
よって、open関数にエンコーディングを指定しないと、ファイルを開けないことが多いはずです。
たとえば日本語が含まれているテキストファイルを開こうとするとエラーになるはずです。
utf-8で保存されているファイルは、↑のようにutf-8のエンコーディングを指定すると、Windowsでも正しく開けるようになります。

このへんは初心者殺しと言える

エンコーディングがらみのエラーって多いよねー

ファイルと例外

open関数はファイルを開くことに失敗するとOSErrorを継承した例外を送出します。
たとえば↓のように存在しないファイルを開くと、

open('404')

↓のようにFileNotFoundErrorが送出されます。

Traceback (most recent call last):
  File ".\sample.py", line 1, in <module>
    open('404')
FileNotFoundError: [Errno 2] No such file or directory: '404'

例外の種類については公式で↓のように紹介されています。
FileNotFoundErrorはかなりよくお世話になる例外と言えますね。

例外をキャッチするにはtry文を使います。

try:
    with open('404') as fin:
        pass
except FileNotFoundError:
    print('ファイルが見つかりませんでした')

おわりに

今回はファイルの入出力処理の前に、ファイルの開閉方法について解説しました。
ファイルの操作は最初はむずかしくて、いや~な感じがすると思います。
しかし慣れてしまえば、なんてことはありません。
なによりファイルの入出力は基本的に設計が統一されているので、一度覚えてしまうとソケット通信や標準入出力の操作などにすぐに応用ができます。
がんばって覚えましょう。

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク