pythonやdjangoを勉強中です。サーバー上で加工したデータを直接ファイル化(openせずに)することはpythonではできないのでしょうか。


例えば、テキストデータをサーバー上で生成・加工し、別のサーバーにFTPする場合です。

text_data = "dummy_text"
ftp.storbinary("STOR /アップロード先/text_file.txt", text_data.encode('文字コード'))

としても
io.UnsupportedOperation: read
とエラーが出てしまいます。つまり、これはftplibが扱うのがファイルオブジェクトでなければならないから、と理解しています。

この場合、一旦、一度ダミーファイルとして保存して再度読み込むといったワンクッションが必要になってしまうのでしょうか。
text_data = "dummy_text"
with open("dummy_file.txt","wb") as f1:
f1.write(text_data.encode('文字コード'))
with open("dummy_file.txt","rb") as f2:
ftp.storbinary("STOR /アップロード先/text_file.txt", f2)

小さいファイルのであればこれもやむなしと思っていますが、例えばアップロードされた大きめのファイルをFTPする必要がある場合などは転送時間短縮のため、直接転送できると良いなと思っています。

ファイルオブジェクトがよく理解できていないようです。。。
ご教授いただけたら幸いです。。。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2022/05/09 07:00:07
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tobeoscontinue No.1

回答回数220ベストアンサー獲得回数59

ポイント100pt

pythonは書いてないので外しているかもしれませんが

text_dataはioじゃないから readはUnsupportedOperationだよとエラーが出ているので

io.StringIO(text_data)とioにしてやればいいのではないでしょうか。


大きなデータの場合、転送時間も多くかかりその間メモリーを占有してしまいます。

一方ファイルを経由する場合はblocksize分だけが必要で転送時間については相手の状況

も関係してくるのでさほど違いは無いと考えられます。


小さいデータの場合はio.StringIOを使い、大きなデータの場合はいったんtmpファイルに落とすほうがいいように思います。

id:datecode

ありがとうございます。

io.StringIOのご指摘から、私がfile-like オブジェクトを理解していなかったことがよくわかりました。

大変助かりました!!

2022/05/10 13:29:22

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません