文系プログラマの雑記

文系プログラマの考え、プログラミングの紹介

【Python・ファイル操作】~withとfor~

f:id:ShotaNukumizu_1000:20210405111435p:plain

おはようございます!Shotaです。

今日も早速、Pythonに関する記事を書いていきます。今日は「with」や「for」を用いたファイル操作について解説していきます。

 

【目次】

 

with

この前の記事では、ファイル操作について解説していきました。ファイル操作をコーディングする際に最も起こる失敗はcloseを忘れることです。Pythonでは、ファイルアクセス中に例外が発生して処理を中断するようなことがあります。

このようなときに、確実にファイルを開放するように処理を行うのはなかなか大変です。このような処理を自動化する際に、Pythonにはwithという構文が用意されています。次のように記述します。

 

with open(引数) as 変数:

 --ファイルアクセスの処理--

 

withの後に、open関数を記述します。戻り値を変数に代入するのではなく、open関数の後にasで変数を指定します。

このwith構文内にファイルアクセスのための処理を記述します。処理を実行し、with構文を抜けると、自動的にファイルがcloseされます。これでcloseの書き漏れやファイルアクセス時の例外に対処できるようになるのです。

試しに、以下のようなコードを見てみましょう。

 

#withを用いたテキストファイルの読み込み
with open('sample.txt', 'r') as f:
    res = f.read()
    print(res)

 

closeの処理がないので、コードが少しコンパクトになりました。with構文を抜けると自動的にファイルがcloseされます。これでファイルが開かれたままプログラムが終了することはありません。

 

for

ファイルにあるテキストをそのまま取り出して利用するには、readは簡単で便利です。しかし、テキストを取り出し処理しながら使う、あるいは巨大なファイルを扱うときはまとめて取り出すよりも少しずつ取り出すほうが便利なこともあります。テキスト処理で最も多いのは一行ずつ読み込む処理です。

openで取得したファイルオブジェクトは、実はそのままコンテナと同じように扱えます。以下のようにコードを書いてみましょう。

 

▼用意するテキストファイル(sample.txt)

this is a sample file.
Hello, Python.
See you.
end

 

 ▼コード

#テキストファイルをforで処理
with open('sample.txt', 'r') as f:
    n = 1
    for line in f:
        print(f'{n}: {line.strip()}')
        n += 1

 

▼実行結果

1: this is a sample file.
2: Hello, Python.
3: See you.
4: end

 

ここでは、一行ずつテキストを取り出して冒頭に行番号を付けて出力していることがわかります。

openで取得したファイルオブジェクト(変数f)から変数lineにテキストを取り出し、どれをprint関数で出力しています。なお、「line.strip()」でstripというメソッドを呼び出していますが、これはテキスト末尾にあるホワイトスペースを取り除くものです。取り出したテキストの末尾には改行コードが付けられているので、それを取り除いているのです。

 

まとめ

【本日のまとめ】

  • withを使ってファイル操作をすれば、closeを書き忘れることがなくなる
  • ファイルオブジェクトは、コンテナと同じように扱うことができる。forを基いてファイル内の文字列を一行ずつ取り出すことができる

 

 

本ブログでは、こんな感じでPythonにまつわる情報や基本的な知識、Pythonの操作方法やニュースをたくさん紹介していきます。毎週日曜日に、普段とは趣向を変えて有名な自己啓発本・ビジネス書を要約・考察するブログを書いていきます。

この記事がいいと思った人はSNSにシェアしてくれると非常に嬉しいです!

明日も本日に引き続き「ファイル操作」を解説していきます。

今日も最後まで読んでくださりありがとうございました!

 

【参考図書】

gihyo.jp