Pythonでのwithの使い方とは?withの基本的な使い方やクラスの作成方法について紹介!

- システム
エンジニア - Pythonでのwithの使い方を教えてください。
- プロジェクト
マネージャー - 分かりました。withの基本的な使い方やクラスの作成方法についてご紹介します。
Pythonでのwithの使い方とは?
今回は、Pythonでのwithの使い方について説明します。withを使用すれば、開始処理と終了処理を確実に実行してくれます。
ファイルの読み書きなどに使用できます。また、クラスにも使用できます。
Pythonでのwithの使い方に興味のある方はぜひご覧ください。
withを使わない方法
withの前に、withを使わない場合の作法について紹介します。自分でクローズ処理を記述する必要があります。実際のソースコードを見てみましょう。
1
2
3
4
5
|
# fileのオープン
f = open("sample.txt", "r")
print(f.read())
# fileのクローズ
f.close()
|
実行結果は以下のようになります。
1
|
Pythonでのwithの使い方とは?
|
withを使わない場合は、fileのクローズを確実に行わなければなりません。忘れないように記述するのは面倒です。
ファイルの読み書き(open)
Pythonでのwithを使ったtxtファイルの読み書きについて紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
|
# file書き込みのためにオープン
with open('sample.txt', 'w') as f:
# ファイルに出力
print('Pythonでのwithの使い方とは?', file=f)
# file読み込みのためにオープン
with open("sample.txt", "r") as f:
# ファイルの内容を出力
print(f.read())
|
実行結果は以下のようになります。
1
|
Pythonでのwithの使い方とは?
|
withを使用すれば、ファイルのクローズを確実に行ってくれます。ソースコードもシンプルになります。
Excelの書き込み(ExcelWriter)
Pythonでのwithを使ったExcelファイルの書き込みについて紹介します。
事前にxlwtおよびopenpyxlをinstallしておいてください。
1
2
|
$ pip install xlwt
$ pip install openpyxl
|
xlwtは、.xlsなどの古い形式のExcelファイルを書き込むためのライブラリです。
openpyxlはxlsx / xlsm / xltx / xltmなどのExcelファイルを書き込むためのライブラリです。
それでは、実際のソースコードを見てみましょう。データフレームをExcelに書き込みます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import pandas as pd
import openpyxl
# データフレームの生成
df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
index=['row_1', 'row_2', 'row_3'], columns=['col_a', 'col_b', 'col_c'])
print(df)
# col_a col_b col_c
#row_1 1 2 3
#row_2 4 5 6
#row_3 7 8 9
# Excelの書き込み(シート名をsheet1に指定)
with pd.ExcelWriter('sample.xlsx') as writer:
df.to_excel(writer, sheet_name='sheet1')
|
実行結果は以下のようになります。
1
2
3
4
|
col_a col_b col_c
row_1 1 2 3
row_2 4 5 6
row_3 7 8 9
|
このようにPythonでは、withを使ったExcelファイルの書き込みができます。
例外処理
withに例外処理を組み合わせる方法を紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def get_content(filepath):
with open(filepath) as f:
try:
content = f.read()
return content
except Exception as e:
print(e)
# ファイルの内容を取得
content = get_content('sample.txt')
print(content)
# ファイルの内容を取得(存在しないファイルを指定)
content = get_content('not_exist.txt')
print(content)
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
|
Pythonでのwithの使い方とは?
Traceback (most recent call last):
File "main.py", line 12, in <module>
content = get_content('not_exist.txt')
File "main.py", line 2, in get_content
with open(filepath) as f:
FileNotFoundError: [Errno 2] No such file or directory: 'not_exist.txt'
|
withを使っているので、ファイルは確実にクローズされています。withを使わない場合は、例外発生時にもファイルを閉じるような処理を記述する必要があります。
withを使えるクラス
クラスインスタンスに対してwithを使用する方法を紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Human:
# インスタンス変数
name = None # 名前
age = None # 年齢
# コンストラクタ
def __init__(self, name, age):
print("init")
self.name = name
self.age = age
def printinfo(self):
print('name:{0}, age:{1}' . format(self.name, self.age))
# コンテキストマネージャの開始処理
def __enter__(self):
print("enter")
return self
# コンテキストマネージャの終了処理
def __exit__(self, ex_type, ex_value, trace):
print("exit: ", ex_type, ex_value, trace)
with Human('taro', 20) as f:
f.printinfo()
|
実行結果は以下のようになります。
1
2
3
4
|
init
enter
name:taro, age:20
exit: None None None
|
withを使用するには、__enter__と__exit__関数を定義する必要があります。__enter__はコンテキストマネージャの開始処理、__exit__にはコンテキストマネージャの終了処理を記述します。
with内でreturn
with内でreturnする場合は、コンテキストマネージャの終了処理は呼び出されるのでしょうか。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Human:
# インスタンス変数
name = None # 名前
age = None # 年齢
def __init__(self, name, age):
print("init")
self.name = name
self.age = age
def printinfo(self):
print('name:{0}, age:{1}' . format(self.name, self.age))
def __enter__(self):
print("enter")
return self
def __exit__(self, ex_type, ex_value, trace):
print("exit: ", ex_type, ex_value, trace)
def hoge():
with Human('taro', 20) as f:
return f.printinfo()
hoge()
|
実行結果は以下のようになります。with内でreturnする場合でも、コンテキストマネージャの終了処理は呼び出されていることが分かります。
1
2
3
4
|
init
enter
name:taro, age:20
exit: None None None
|
- システム
エンジニア - Pythonでのwithの使い方についてよくわかりました。
- プロジェクト
マネージャー - withが使えるクラスの作成方法についてもご参考ください。
まとめ
いかがでしたでしょうか。Pythonでのwithの使い方について説明しました。withを使用すれば、開始処理と終了処理を確実に実行してくれます。
ソースコードもシンプルになりますし、堅牢なコードになります。
ぜひご自身でソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Python新着案件New Job
-
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都豊島区(池袋駅) -
マルチロガーソフト開発/東京都豊島区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都豊島区(池袋駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅) -
商品化予定の振動センサーの運用保守/Python/東京都都内/【WEB面談可】
月給50万~60万円東京都都内(-駅) -
商品化予定の振動センサーの可視化UI開発のテスター/Python/東京都都内/【WEB面談可】
月給25万~35万円東京都都内(-駅)