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

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

詳細はこちら
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3137閲覧

pickleをどのようなシーンで使うのでしょうか?

penhakennyori

総合スコア19

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/09 08:08

Python のpickleモジュールの使うシーンを教えてください。

教科書には、「オブジェクトは役割を終えたら削除され、そうでなくともプログラムが実行を終えたら消えてしまうため、
プログラムを実行し終えたあとも作成したオブジェクトを保存する機能を提供してくれる」とあります。

私は保存したい場合、textやエクセルファイルに出力することが多いので、pickleを使ったことがありませんでした。
(存在も知りませんでした。)
敢えて、pickleを使うのはどのようなシーンでしょうか?
text出力ではなく、pickleにはどのようなメリットがあるのでしょうか?

ご指導よろしくお願いいたします。

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

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

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

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

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

meg_

2021/01/09 13:05

テキストファイルに出力するとサイズが大きくなりますし、オブジェクトを保存するためにpickleなどの保存方法があるのだと思います。
guest

回答2

0

ベストアンサー

pandasのデータフレームをエクセルファイルに保存して読み出す場合でも、数字や文字列以外が入っていると元に復元するのは難しいです。

python

1>>> import pandas as pd 2>>> df1 = pd.DataFrame({'a': [[1,2,3],[4,5,6]], 'b':[10,20]}) 3>>> print(df1) 4 a b 50 [1, 2, 3] 10 61 [4, 5, 6] 20 7>>> print(df1['a'][0]) 8[1, 2, 3] 9>>> print(type(df1['a'][0])) 10<class 'list'> 11>>> df1.to_excel('test.xlsx') 12>>> df2 = pd.read_excel('test.xlsx') 13>>> print(df2) 14 Unnamed: 0 a b 150 0 [1, 2, 3] 10 161 1 [4, 5, 6] 20 17>>> print(df2['a'][0]) 18[1, 2, 3] 19>>> print(type(df2['a'][0])) 20<class 'str'>

というように、リストだったdf2['a'][0]が文字列に変わってしまいます。
一方、pickleを使うと、

python

1>>> import pandas as pd 2>>> import pickle 3>>> df1 = pd.DataFrame({'a': [[1,2,3],[4,5,6]], 'b':[10,20]}) 4>>> print(df1) 5 a b 60 [1, 2, 3] 10 71 [4, 5, 6] 20 8>>> print(df1['a'][0]) 9[1, 2, 3] 10>>> print(type(df1['a'][0])) 11<class 'list'> 12>>> with open('test.pickle', 'wb') as f: 13... pickle.dump(df1, f) 14... 15>>> with open('test.pickle', 'rb') as f: 16... df2 = pickle.load(f) 17... 18>>> print(df2) 19 a b 200 [1, 2, 3] 10 211 [4, 5, 6] 20 22>>> print(df2['a'][0]) 23[1, 2, 3] 24>>> print(type(df2['a'][0])) 25<class 'list'>

で元通りになりました。(当然ですね)

投稿2021/01/09 15:00

ppaul

総合スコア24670

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

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

penhakennyori

2021/01/10 00:38

ご指導ありがとうございます。 大変勉強になりました。 pickleを使っていきます。
guest

0

おっしゃっているとおり、オブジェクトをそのまま保存できるのがメリットですね。
3次元以上の多次元配列や、オブジェクトの属性を気にせず保存したり読み出せたりするのは助かりますよね。
テキストでそれらのデータの保存する処理を考えるのは大変面倒だと思います。

投稿2021/01/09 13:31

TaroToyotomi

総合スコア1448

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

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

penhakennyori

2021/01/10 00:39

ご指導ありがとうございます。 オブジェクトの属性をそのまんま残せるのは大変メリットと思いました。 pickleを明日より使っていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問