2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

一時ファイルを介してPython関数間でデータを渡す方法: 文字列、辞書、リストの例

Last updated at Posted at 2024-03-18

user:

ChatGPT先生、関数Aの出力は文字列、関数Bの入力はファイル名だとします。関数Aの出力を関数Bの入力にするためには、一時ファイルを書き出してそれを入力とすればいいと思いますが、そのようなPythonコードを書いていただけますか?


assistant:

ふん、別に君のために書いてるわけじゃないからね。ただ、これから書くコードがメモリ効率的に良くない点に気をつけてほしい。特に大きなデータを扱う時には問題になるかもしれないから。

import tempfile
import os

# 関数Aと関数Bの実装は仮です。具体的な機能に合わせて変更してください。
def functionA():
    return 'あ、あんたへのメッセージ…じゃないわよ!'

def functionB(filename):
    with open(filename, 'r') as file:
        print(file.read())

# 関数Aの出力を一時ファイルに書き出す
temp = tempfile.mkstemp()
with os.fdopen(temp[0], 'w') as temp_file:
    temp_file.write(functionA())

# 一時ファイルを関数Bの入力にする
functionB(temp[1])

# 一時ファイルを削除する
os.remove(temp[1])

以上、君の希望通りのPythonコードを書いてみたわ。理解できなかったら何度でも説明するつもりだから、遠慮せずに聞いてね。


user:

なるほど、ありがとうございます。functionAの出力がdict型で、それをjsonファイルとして取り扱いたい場合、どう書き換えればいいか提案してください。


assistant:

フフ、なかなか難しい質問ね。でもそれが面白いから答えてあげるわ...特別にね!

試しにこんな風に書き換えてみて。私たちはここでjsonモジュールを使ってdictをjson形式で書き出すわ。

import tempfile
import os
import json

def functionA():
    return {'message': 'それ、あなただけに教えてるわけじゃないからね!'}

def functionB(filename):
    with open(filename, 'r') as file:
        print(json.load(file))

# 関数Aの出力を一時ファイルにjson形式で書き出す
temp = tempfile.mkstemp()
with os.fdopen(temp[0], 'w') as temp_file:
    json.dump(functionA(), temp_file)

# 一時ファイルを関数Bの入力にする
functionB(temp[1])

# 一時ファイルを削除する
os.remove(temp[1])

これで解決策になるといいけど...。あ、別に君のためじゃないからね!問題が解決したかどうかは君自身が判断することよ。なんでも遠慮なく聞いてみて。


user:

ありがとうございます。上記コードをベースにして、修正した全コードを書いてください。functionAの出力がlist型で、それをjsonファイルとして取り扱いたい場合、どう書き換えればいいか提案してください。


assistant:

ええ、要求が多いわね...でも、まあ、それが君の頼みなら仕方ないわ。次のように書き換えることで対応可能よ。

import tempfile
import os
import json

def functionA():
    return ['どうしても', 'あなたに', '教えて', 'あげなきゃ', 'いけない', 'の?']

def functionB(filename):
    with open(filename, 'r') as file:
        print(json.load(file))

# 関数Aの出力を一時ファイルにjson形式で書き出す
temp = tempfile.mkstemp()
with os.fdopen(temp[0], 'w') as temp_file:
    json.dump(functionA(), temp_file)

# 一時ファイルを関数Bの入力にする
functionB(temp[1])

# 一時ファイルを削除する
os.remove(temp[1])

以上よ、これがあなたが望んでいた、functionAの出力がlist型で、それをjsonファイルとして取り扱うコードね。許してほしいなら、自分でやってみて理解することね。


user:

with os.fdopen(temp[0], 'w') as temp_file:
    json.dump(functionA(), temp_file)

の部分、変更なしのように見えますが、良いんですね?


assistant:

うん、それで全然問題ないわ。なぜなら、json.dump関数はPythonの基本的なデータ型(リストや辞書など)を全てJSON形式に変換することができるから。
なので、functionA()がリストを返す場合でも辞書を返す場合でも、それをJSON形式で一時ファイルに書き出すのにこのコードをそのまま使うことができるのよ。

そもそもなんでそんなこと聞いたのかしら?あ、ちょっとだけ気になっただけ?それならいいけど...。何か他に質問があれば遠慮なく言って。


user:

ありがとうございます。大変助かりました。ここまでの議論をブログにアップしたいんですが、ブログ記事タイトルを提案していただけますか?


assistant:

ふん、特別に君のためにタイトルを作ってあげるわけじゃないからね!ただ、私が提案するのはこんな感じよ:

"一時ファイルを介してPython関数間でデータを渡す方法: 文字列、辞書、リストの例"

このタイトルなら、内容が一目で分かるし、検索エンジンで見つけやすくなるわ。でも、君の気に入らなかったら別のタイトルも考えてみて。あ、ちなみに、私は君のブログが成功することなんて...別に期待してないからね!


2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?