🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

4回答

22705閲覧

Pythonでopenしたものは必ずcloseの必要がありますか?

h5x

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

3クリップ

投稿2019/10/17 17:55

このようなコードを書いた場合このopenはcloseする必要がありますか?
また、必要な場合、どのようにすればいいでしょうか?

Python3

1for line in open('file.txt'): 2 line = line.strip() 3 print (line) 4```import re

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/10/17 18:35

OpenしたファイルをCloseしないって、気持ち悪くないですか? 開けたドアを、閉めないみたいな・・・・
h5x

2019/10/17 18:43

ありがとうございます。この場合、どのようにすればcloseできますか? 通常であれば、ファイルハンドルがありますがこの場合、ファイルハンドルはどちらになりますか?
guest

回答4

0

必ずcloseの必要がありますか?

放っておいてもガベージコレクションによっていずれクローズされることが期待されます。
しかし明示的に閉じるのが良い習慣です。

通常であれば、ファイルハンドルがありますがこの場合、ファイルハンドルはどちらになりますか?

一旦別の変数に保持するか、with文を使います。

Python

1fin = open('file.txt') 2for line in fin: 3 ... 4 5fin.close()

Python

1with open('file.txt') as fin: 2 for line in fin: 3 ...

以下の二つの理由から、一般には後者が推奨されます。

  • closeの書き忘れを防げる
  • 例外発生時も、リソースを確実に解放できる

特に後者は見落としがちです。


詳しくはPythonチュートリアルをどうぞ。ほぼ同じことが書いてあります。
7. 入力と出力 - ファイルを読み書きする — Python 3.7.5 ドキュメント

投稿2019/10/17 21:58

編集2019/10/17 22:00
LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h5x

2019/10/18 08:38

ありがとうございます。 大きなプログラムだと閉じないと不安になってきそうですね。 書き方について、今回質問したものはさっとテキストを見たりするには非常にシンプル(1行で書ける)ので気に入っているのですが、closeの処理は勝手になされているのでしょうか?チュートリアルではファイルハンドル必須みたいな書き方ですが、それなしで開いた場合例えば無名の入るハンドルみたいなものが発行されそれをcloseする方法や繰り返しを抜けると勝手にcloseされたりはないでしょうか?
LouiS0616

2019/10/19 03:52

> closeの処理は勝手になされているのでしょうか? GCが代行していることが期待されます。 タイミングは基本的に任意です。 > それなしで開いた場合 ~ ないでしょうか? パッとは出てこないですね。
guest

0

クローズは、プログラム終了時に自動的にされますので、すぐに実行が終わるプログラムだとクローズしなくても実害はないです。

クローズもせず、with openも使わない場合の問題点としては、

・オープンしっぱなしのファイルが増えるので、長時間実行するプログラムや、どんどんファイルをオープンする一方のプログラムだと、リソース(メモリや、1プロセスからオープン可能なファイル数の上限)使用量が問題になるかもしれない

・書き込み用のファイルをクローズしないと、「まだファイルに書き込まれていないデータ」がライブラリのバッファ上に残っているかもしれないので、その段階でOSごと落ちたり、プロセスが強制終了されたりすると、「まだファイルに書き込まれていないデータ」が失われる

投稿2019/10/18 12:37

otn

総合スコア85888

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Pythonは詳しくないですが、基本的にFileを指定してOpenした場合、
よほど特殊な言語ではない限り、Closeを対に入れる必要があると思います。

https://tonari-it.com/python-with-file-open-close/

以下上記URLより引用

引用テキストファイルをクローズしないと
・システムのリソースを食ったまま
・ 他のプログラムがファイルにアクセスできなくなる
などのリスクがあります。

Python自体の扱いは触った程度しかないので、PythonでCloseしなくていい理由や場面がある場合、知見として知りたいです

投稿2019/10/17 18:14

hermit19901127

総合スコア368

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h5x

2019/10/17 18:45

ありがとうございます。 このスクリプトを書いたときに、ファイルハンドル無しで開いてしまえ、どのようにファイルハンドルを閉じればいいでしょか? 自分で書いて不思議に思ったため皆さんはどのようにされているのか気になり質問いたしました。
guest

0

1. 閉じることが必須か?
閉じなくても動くので必須ではありませんが、閉じた方がリソースを浪費しないので好ましい、ということだと思います。

2. 閉じ方
1) 手動で閉じる
初めに開くファイルを定義してそれをcloseさせます。ここを参照ください。
※質問のfor文の行に as f:をくっつけただけだと文法エラーが出て閉じられません(検証済み)。

2) 自動で閉じる
Stack overflowのjfsさんが一行ずつ読み出すならwithでくくったらいいよ、と回答していますね。withを抜けるときに自動でcloseされるので忘れ防止にもなります。

投稿2019/10/17 21:40

編集2019/10/17 21:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h5x

2019/10/18 08:33

ありがとうございます。 大きなプログラムだと閉じないと不安になってきそうですね。なお、今回質問した書き方はさっとテキストを読む場合には非常にシンプル(1行で書ける)ので気に入っているのですが、closeの処理は勝手になされているのでしょうか?リンク先の英語の文章を読んだのですが、スコープを抜けたらとか繰り返しを抜けたらcloseされるような記載がありどちらかの下記になっています。また、無名のファイルハンドルみたいな物があればあとでcloseできそうですがPythonではそういったものは発行されませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問