2016-10-18 10 views
0

私は、ファイルにデータを書き込む機能が欲しい:ファイルのようなオブジェクトがあるかどうかはどうすればわかりますか?

def data_writer(data, file_name): 
    spiffy_data = data # ... 
    with open(file_name, 'w') as out: 
     out.write(spiffy_data) 

しかし、時には、私が代わりにファイル名のファイルオブジェクトを持っています。この場合、時々tempfile.TemporaryFile(書き込み可能なファイルのようなオブジェクトを作成する)があります。

私のような何かを書くことができるようにしたいと思います:

def data_writer(data, file_thing): 
    spiffy_data = data # ... 
    if type(file_thing) is file_like: 
     file_thing.write(spiffy_data) 
    else: 
     with open(file_name, 'w') as out: 
      out.write(spiffy_data) 

これを行うには良い方法は何ですか?

また、Pythonで行うのは理にかなっていますか?

+1

「isinstance(file_thing、str)」という文字列があるかどうかをチェックするだけです。そうであれば、それをファイル名として扱い、そうでなければファイルのようなオブジェクトとして扱います。 –

+3

いつもファイルのようなものを取っておき、発信者にそれを処理させるのはなぜですか? –

+0

あるいは、いくつかのAPI([例えば 'tarfile.open'](https://docs.python.org/3/library/tarfile.html#tarfile.open))はデフォルトでファイル名を取得しますが、代わりにキーワードで 'fileobj'を使用するので、ファイルを開く代わりにそのファイルを使用します。これが意味をなさないならばあなた次第です。 – ShadowRanger

答えて

0

あなたのアプローチはLBYLですが、それはEAFPと推測しています。だから、デフォルトのケースを表しちょうどtryそれは

except潜在的な例外、これに応じて、あなたは良い感じ、あなたが受け取ったfile_thingまたは

  • open()

    • write()にできました。

      編集: Cf ShadowRanger's commentなぜ例外処理をコンテキストマネージャと混ぜるのは、ここではあまりにも不愉快です。

  • +2

    EAFPはここでうまくいく。あなたが '書き込み 'しようとする時には、あなたは既に書き込みロジックに入っており、遡及的にファイルを開くのは面倒です。特に、あなたが好きで、 'with'ステートメントを使ってあなたが開いたファイルオブジェクトの寿命を管理しているならば。 – ShadowRanger

    +0

    ええ、良い点。例外を処理することは、コンテキストマネージャーとうまくいっていません。/ – dtk

    +0

    書き込み論理が取り除かれた(または実際には1ライナーである)場合、それは問題ありません。あなたは、醜いデータを書き込むためにコールをコピー/ペーストする必要がありますが、私はそこに解決策を見ていません... –

    3

    関数は1つのことを実行し、その1つをうまく実行する必要があります。 data_writerの場合、その1つはファイルのようなオブジェクトにデータを書き込むことです。呼び出し元がそのようなオブジェクトを提供することを心配させてください。つまり、ファイル名をとり、data_writerのためにそれを開くラッパーの形式でその呼び出し元を提供することもできます。

    def data_writer(data, file_obj): 
        spiffy_data = data # ... 
        file_obj.write(spiffy_data) 
    
    def write_data_to_file(data, file_name): 
        with open(file_name, "w") as f: 
         data_writer(f, file_name) 
    
    関連する問題