2017-09-18 8 views
2

Nunez-IglesiasらがElegant SciPyを読み始めました。アル、およびブック(.txtファイル)の最初のデータセットを開くとき、著者はpd.read_csvでCSVファイルを開く - コンテキストマネージャの目的は何ですか?

filename = 'data/counts.txt' 
with open(filename, 'rt') as f: 
    data_table = pd.read_csv(f, index_col=0) # Parse file with pandas 

を使用しています。しかし、私は(Andy Hayden's answer hereを参照)、それはファイルディスクリプタを与え開いていることを考えると、read_csvは、ファイルを閉じるだろうと思いました。

あなたはread_csvにファイルハンドルを渡したり、ファイル名を渡すことができますので、ここでは、コンテキストマネージャにどのような目的があり、あるいは我々は同じように安全に

filename = 'data/counts.txt' 
data_table = pd.read_csv(filename, index_col=0) 

答えて

1

を書くことができます。最初のケースでは、ファイルハンドルを作成するので、もう一度閉じる必要があります。しかし、ファイルに渡すと、read_csvがファイルを開き、(適切な場合)再度閉じます。

だから、ほとんどの場合、それだけでファイル名を提供するために、より簡単にオプションです:

data_table = pd.read_csv(filename, index_col=0) 

注意ファイルハンドルに渡すオプションを使用すると、ファイルのようなオブジェクトを渡すことを可能にすること:

>>> from io import StringIO 
>>> import pandas as pd 
>>> myio = StringIO("""a b c 
... 0 1 2 3 
... 1 4 5 6""") 
>>> pd.read_csv(myio, sep=' ', header=0, index_col=0) 
    a b c 
0 1 2 3 
1 4 5 6 

実際のファイルハンドルをread_csvに実際に渡すのはむしろまれです。私が考えることができる唯一のケースは、パンダがファイル自体を開くことができない場合です。たとえば、一般的でない圧縮アルゴリズムを使用して圧縮されている場合。

+0

確かに、作者は単に良い習慣を植えようとしているに過ぎないかもしれませんが、ここでは必要ないでしょう。ありがとう、私はちょうど私が何かを逃していないことを確認したかった。 –

+1

そうだと思います。 'read_csv'にファイルハンドルを渡す正当な理由があるのか​​どうかわかりません。しかし、おそらくファイルは圧縮されています(パンダには未知のフォーマットを使用しています)。そしてあなた自身が解凍してファイルハンドルを 'read_csv'に渡す以外に選択肢はありません。その場合は、ファイルハンドルがあなたの責任であることを知っておくとよいでしょう。 – MSeifert

関連する問題