Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのファイルオブジェクトとは?open関数によるファイル操作の基本を徹底解説

Pythonでは、ファイルを読み書きする際に特別なライブラリをインポートする必要はありません。ファイル操作は言語にネイティブに組み込まれているためです。

まず最初に行うのは、組み込み関数 open() を使ってファイルオブジェクトを取得することです。open() 関数はファイルを開き、ファイルオブジェクトを返します。このファイルオブジェクトには、開いたファイルから情報を取得したり、内容を操作したりするためのメソッドや属性が含まれています。

ファイルとは何か?

ファイル操作を行う前に、「ファイルとは何か」を理解しておきましょう。ファイルとは、関連する情報を保存するためにディスク上に確保された「名前付きの場所」のことです。名前と場所を持つため、ハードディスク上に保存されます。

Pythonにおけるファイル操作は、次の順序で行われます。

  • ファイルを開く(オープン)
  • 読み込みまたは書き込み処理を行う
  • ファイルを閉じる(クローズ)

ファイルを開く ― open() 関数

読み書きの目的でファイルを開くには、組み込みの open() 関数を使用します。

open() 関数は2つの引数を受け取ります。1つ目はファイル名、2つ目はファイルを開く目的(読み込み用か書き込み用か)を示すモードです。

Pythonでファイルオブジェクトを開く構文は以下の通りです。

File_obj = open("filename", "mode")

各要素の意味

  • File_obj:ハンドルとも呼ばれ、ファイルオブジェクトを格納する変数です。
  • filename:開きたいファイルの名前です。
  • mode:インタプリタに対して、ファイルをどのように使用するかを伝えます。
>>> f = open("pytube1.py") # カレントディレクトリのファイルを開く
>>> f = open(r"c:\users\rajesh\Documents\readme.txt") # 指定したパスのファイルを開く

モード引数について

上記の例からも分かるように、open() 関数の第2引数であるモードは省略可能です。ファイルを開く際に、読み込み用の「r」、書き込み用の「w」、追記用の「a」などを指定できます。また、テキストモードで開くかバイナリモードで開くかも指定できます。

デフォルトはテキストモードで、この場合ファイルから読み込んだ内容は文字列として取得されます。

open() 関数がサポートする主なモードは以下の通りです。

Pythonのファイルモード一覧

モード説明
'r'読み込み用にファイルを開く(デフォルト)
'w'書き込み用にファイルを開く。ファイルが存在しない場合は新規作成し、存在する場合は内容を空にしてから開く
'x'排他的作成用にファイルを開く。すでにファイルが存在する場合はエラーになる
'a'既存の内容を切り詰めずに、ファイル末尾への追記用に開く。ファイルが存在しない場合は新規作成される
't'テキストモードで開く(デフォルト)
'b'バイナリモードで開く
'+'更新用(読み書き両方)にファイルを開く
>>> f = open("pytube1.py") # 'r' または 'rt' を指定したのと同じ
>>> f = open("pytube1.py", "w") # テキストモードで書き込む
>>> f = open("color3.jpg", "r+b") # バイナリモードで読み書きする

デフォルトのエンコーディングはプラットフォーム依存です。Windowsでは「cp1252」、Linuxでは「utf-8」が使われます。トラブルを避けるためにも、エンコーディングを明示的に指定することをおすすめします。

>>> f = open("pytube1.py", mode = "r", encoding = 'utf-8')

テキストファイルを作成する

それでは、Pythonを使って簡単なテキストファイルを作成してみましょう。任意のテキストエディタでも構いませんが、ここではPythonシェルを使用します。

>>> # カレントワーキングディレクトリに "textfile.txt" という名前のテキストファイルを作成
>>> f = open("textfile.txt", "w")
>>> # 上記のコードでデフォルトのディレクトリに textfile.txt が作成される
>>> f.write("Hello, Python")
13
>>> f.write("\nThis is our first line")
23
>>> f.write("\nThis is our second line")
24
>>> f.write("\nWhy writing more?, Because we can :)")
37
>>> f.close()

write() メソッドの戻り値として表示されている数字は、書き込まれた文字数です。実行後、カレントワーキングディレクトリに「textfile.txt」という新しいファイルが作成されます。このファイルを開くと、次のような内容になっています。

Pythonのファイルオブジェクトとは?open関数によるファイル操作の基本を徹底解説

Pythonでテキストファイルを読み込む

Pythonでテキストファイルを読み込む方法は複数あります。

read():ファイル全体を読み込む

ファイル内のすべての文字を含む文字列を一度に取得したい場合は、read() メソッドを使用します。

>>> f = open("textfile.txt", "r")
>>> f.read()
'Hello, Python\nThis is our first line\nThis is our second line\nWhy writing more?, Because we can :)'

指定した文字数だけ読み込む

ファイルから特定の文字数だけ読み込みたい場合も、非常に簡単に行えます。read() の引数に文字数を指定するだけです。

>>> f = open("textfile.txt", "r")
>>> print(f.read(13))
Hello, Python

readline():1行ずつ読み込む

ファイルを1行ずつ読み込みたい場合は、readline() 関数を使用します。呼び出すたびに、次の行が順番に返されます。

>>> f = open("textfile.txt", "r")
>>> print(f.readline())
Hello, Python

>>> print(f.readline())
This is our first line

>>> print(f.readline())
This is our second line

>>> print(f.readline())
Why writing more?, Because we can :)

readlines():すべての行をリストで取得する

ファイル内のすべての行を、区切られた状態でまとめて取得したい場合は、readlines() 関数を使用します。各行が要素となったリストが返されます。

>>> f = open("textfile.txt", "r")
>>> print(f.readlines())
['Hello, Python\n', 'This is our first line\n', 'This is our second line\n', 'Why writing more?, Because we can :)']

各行がカンマで区切られたリストとして返されているのが分かります。

ファイルオブジェクトに対するループ処理

ファイル内のすべての行を、最も構造的かつ効率的に読み取りたい場合は、ループ処理を使う方法がおすすめです。ファイルオブジェクトはイテラブルなので、for文で直接回せます。

>>> f = open("textfile.txt", "r")
>>> for line in f:
print(line)

Hello, Python

This is our first line

This is our second line

Why writing more?, Because we can :)

ファイルへの書き込み

ファイルへの書き込みはシンプルです。ファイルを開いて、書き込みたいテキストを渡すだけです。

この方法は、既存のファイルにデータを追記する場合にも使えます。データを書き込んだ後に改行したい場合は、EOL(改行)文字「\n」を使用します。

>>> f = open("textfile.txt", "w")
>>> f.write("There are tons to reason to 'fall in love with PYTHON'")
54
>>> f.write("\nSee, i have added one more line :).")
36
>>> f.close()
>>> f = open("textfile.txt", "r")
>>> for line in f:
print(line)

There are tons to reason to 'fall in love with PYTHON'
See, i have added one more line :).

なお、モード「w」で開くと既存の内容は消去されるため、既存ファイルに追記したい場合はモード「a」を使用してください。

ファイルを閉じる

ファイルの操作が完了したら、必ず f.close() コマンドを実行しましょう。これによりファイルが完全に閉じられ、使用中だったすべてのリソースが解放され、システムが他の用途に使えるようになります。

>>> f = open("textfile.txt", "r")
>>> f.close()
>>> f.readlines()
Traceback (most recent call last):
File "<pyshell#95>", line 1, in <module>
f.readlines()
ValueError: I/O operation on closed file.

このように、ファイルを閉じた後にファイルオブジェクトを使用しようとすると、エラーが発生します。

withステートメントの活用

withステートメントは、ファイルオブジェクトと組み合わせて使用できます。withステートメントとファイルオブジェクトを併用すると、よりクリーンな構文になり、例外処理もプログラムに組み込みやすくなります。

もう一つの大きなメリットは、ファイル操作が完了すると、開いていたファイルが自動的に閉じられる点です。close() の呼び忘れによるリソースリークを防げます。

構文

with open("filename") as file:

例:withステートメントで読み込む

>>> with open("textfile.txt") as f:
for line in f:
    print(line)

出力結果

There are tons to reason to 'fall in love with PYTHON'

See, i have added one more line :).

ご想像の通り、withステートメントを使ったファイルへの書き込みも簡単です。

>>> with open("textfile.txt", "a") as f:
f.write("\nHello, Python-Here i come once again!")

38
>>> with open("textfile.txt") as f:
for line in f:
print(line)


There are tons to reason to 'fall in love with PYTHON'

See, i have added one more line :).

Hello, Python-Here i come once again!

テキストファイルの行を分割する

テキストファイルから読み取った行は、Pythonの split() 関数を使って分割できます。分割に使う文字は自由に選べます。スペースでも、コロンでも、その他の任意の文字でも構いません。

>>> with open("textfile.txt", "r") as f:
data = f.readlines()
    for line in data:
       words = line.split()
       print(words)

出力結果(スペースで分割)

['There', 'are', 'tons', 'to', 'reason', 'to', "'fall", 'in', 'love', 'with', "PYTHON'"]
['See,', 'i', 'have', 'added', 'one', 'more', 'line', ':).']
['Hello,', 'Python-Here', 'i', 'come', 'once', 'again!']

上記のようにスペースで分割する代わりに、コロンでテキストを分割したい場合は、line.split()line.split(":") に変更するだけです。その場合の出力は次のようになります。

["There are tons to reason to 'fall in love with PYTHON'\n"]
['See, i have added one more line ', ').\n']
['Hello, Python-Here i come once again!']

まとめ

Pythonのファイル操作は、open() 関数でファイルを開き、read()write() などのメソッドで読み書きを行い、最後に close() で閉じるという流れが基本です。特に実務では、自動的にファイルを閉じてくれるwithステートメントを使うことで、安全で可読性の高いコードを書くことができます。用途に応じて適切なモードとエンコーディングを指定し、効率的にファイルを扱いましょう。

  1. Python Tkinterのaskopenfile()関数でファイルを選択して読み込む方法

    Pythonプログラムで使用するファイルのパスをハードコーディングする代わりに、GUIを使ってユーザー自身にフォルダ構造をブラウズさせ、目的のファイルを選択してもらうことができます。これはtkinterモジュールを利用することで実現でき、キャンバス(ウィンドウ)を定義し、その上にファイルを参照するためのボタンを配置します。以下のプログラムでは、ファイルを開くための関数を定義しています。ここではテキストファイルを開くことに限定しています。Pythonはテキストファイルの内容を読み取り、非常に読みやすい形で出力できるためです。.txtや.csvなど、テキストベースのファイルであればどのようなもので

  2. 【Python】ジャンクファイルオーガナイザーで面倒なファイル整理を一括自動化

    はじめに 大量のファイルやフォルダをひとつのディレクトリに放り込みっぱなしにして、「何のファイルがあったんだっけ?」と混乱しがちなPythonプログラマーは少なくありません。そんな「怠惰(=効率重視)」な開発者にとって、手作業でのファイル整理は面倒この上ないものです。 そこで本記事では、散らかったフォルダ内のファイルを拡張子ごとに適切なフォルダへ一括で振り分け、さらに不要になった空のディレクトリまで削除してくれるPythonスクリプトを紹介します。コマンドひとつでフォルダがすっきり片付くので、ぜひ活用してみてください。 具体的には、さまざまな種類のファイルが混在したディレクトリ(下図)を入力と