質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

3回答

4480閲覧

python with open などのファイル操作について

noz_awsinf_sp

総合スコア62

Python 3.x

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

1グッド

1クリップ

投稿2020/05/09 06:01

基本的な質問なのかもしれませんが、pythonなどのプログラムでファイルを操作する場合について教えてください。

例えば、/home/test/hogehoge.txt を
with onen('/home/test/hogehoge.txt') as f:で読み込んだ場合は
直接操作する?ことになるのでしょうか?

よく書籍だとopen()だけだと、xxx.close() で閉じないとメモリに残り続けるから云々ってかいてあるので
一旦メモリ上に展開して、プログラムで処理が完了次第、データを保存してメモリを開放するみたいな動作になるんでしょうか?

そうであった場合に、/home/test/hogehoge.txt が1GBくらいの大きさで会った場合はメモリ数が足りなければ
エラーになるのか、それとも加工するデータ分だけメモリ数が残っていればいいのか気になりました。

よろしくおねがいいたします。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答3

0

質問自体の内容については、「そうならないよう自分で考えて処理する」としか回答できませんが、ちょっと別の点で気になったので。

よく書籍だとopen()だけだと、xxx.close() で閉じないとメモリに残り続けるから云々ってかいてあるので

と、

一旦メモリ上に展開して、プログラムで処理が完了次第、データを保存してメモリを開放するみたいな動作になるんでしょうか?

は別の話です。

同時にファイルをオープンできる数は、OSによって制限があります。

ですから、「closeしないとメモリに残り続ける」という言い方は、うーん、ちょっと違うんじゃないかな、でも初心者にはそう説明しても仕方ないかな、という感じがします。
openしたままcloseしないと、メモリ自体は残るというのは厳密にいうと間違いじゃないと思うけど微々たるもので、それよりも上記の制限に引っかかる事の方が重要でしょう。

まぁもっとも、ファイルディスクリプタもメモリもプログラムからすればOSからの借用物であり、借りた物はしっかり返さなきゃいけないというのはどちらも同じ事だと思います。

投稿2020/05/09 08:13

編集2020/05/09 08:17
katsuko

総合スコア3462

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

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

0

ベストアンサー

たとえば

python

1with onen('/home/test/hogehoge.txt') as f: 2 pass

であれば一行も読まれず、(ファイルの中身を展開することで)メモリを消費することもありません。

実際はf.read()などで「ファイルを読む」ことでファイルの中身がPython文字列とかとして読み込まれ、そこで初めてメモリ上に展開される訳です。柔軟に制御できるよう、曲りなりに色々なメソッドが用意されています(たとえば一行読んで返すreadlineなど)。大きなファイルの場合は、それらをうまく使って「メモリが溢れないように」プログラムを書くことが可能です。

詳細はリファレンスで確認してください。

io --- ストリームを扱うコアツール — Python 3.8.3rc1 ドキュメント

また、with文は自動で適切にリソース解放の処理を行うので、closeを呼ぶ必要はこの場合ありません。

投稿2020/05/09 12:13

hayataka2049

総合スコア30933

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

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

0

そのまま読み込めば全てメモリに乗る形になると思います。
しかしそれを解決するために、一定の容量や行ごとに少しずつ読み込む方法がいくつかあります。
以下のページが参考になると思います。

https://stackoverflow.com/a/519653

投稿2020/05/09 07:04

kazchimo

総合スコア172

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問