[解決済み] with open(...)`と`sys.stdout`の両方をうまく扱うには?
2022-10-21 19:22:58
質問
しばしば、データをファイルに出力したり、ファイルが指定されていない場合は標準出力に出力する必要があります。私は以下のスニペットを使用しています。
if target:
with open(target, 'w') as h:
h.write(content)
else:
sys.stdout.write(content)
これを書き換えて、両方のターゲットを一律に扱いたい。
理想的な場合はそうなります。
with open(target, 'w') as h:
h.write(content)
から離れるときに sys.stdout が閉じられるので、これはうまくいきません。
with
ブロックから出るときにsys.stdoutが閉じられてしまうからです。私は
stdout = open(target, 'w')
...
というのは、元の標準出力に戻すのを忘れないようにする必要があるからです。
関連する
- Pythonで標準出力をファイルにリダイレクトしますか?
- 例外の処理 - C++ と比較した場合の Python での例外処理に関する興味深い記事です。
編集
を折り返すことができることは知っています。
target
をラップしたり、別の関数を定義したり、あるいは
コンテキストマネージャ
. 私は5行以上を必要としない、シンプルでエレガントで慣用的なソリューションフィッティングを探しています。
どのように解決するのですか?
既成概念にとらわれない発想で、カスタムな
open()
メソッドはどうでしょうか?
import sys
import contextlib
@contextlib.contextmanager
def smart_open(filename=None):
if filename and filename != '-':
fh = open(filename, 'w')
else:
fh = sys.stdout
try:
yield fh
finally:
if fh is not sys.stdout:
fh.close()
このように使います。
# For Python 2 you need this line
from __future__ import print_function
# writes to some_file
with smart_open('some_file') as fh:
print('some output', file=fh)
# writes to stdout
with smart_open() as fh:
print('some output', file=fh)
# writes to stdout
with smart_open('-') as fh:
print('some output', file=fh)
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] Pythonで "with open "を使って複数のファイルを開くにはどうしたらいいですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] テキストファイルを文字列変数に読み込んで、改行を除去するには?
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] 組込み開関数におけるモードa、a+、w、w+、r+の違い?
-
[解決済み】大文字と数字を含むランダムな文字列の生成
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Pythonでstdoutをファイルにリダイレクトする?
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] if 節の終了方法
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?