2017-06-27 10 views
3
def test(file_name): 
    if file_name.lower().endswith('.gz'): 
     with gzip.open(file_name) as f: 
      f_csv = csv.reader(i.TextIOWrapper(f)) 
      #### Same Code 

    if file_name.lower().endswith('.csv'): 
     with open(file_name) as f: 
      f_csv = csv.reader(i.TextIOWrapper(f)) 
      #### Same Code 

質問> '同じコード'セクションを複製せずに上記のコードを組み合わせる方が良いでしょうか?関数testは、file_nameがgzファイルの場合はgzip.openを使用し、それ以外の場合は通常のopenで開きます。同じコードを持つステートメントで2つのpythonを結合する

+0

「####同じコード」を(ローカル)関数に入れるだけですか? 'def same_code(f_csv):...'例えば、最後にファイルハンドラを置くか、カスタムディスパッチ関数を書くなどしてファイルハンドラをディスパッチします。 'with custom_open(file_name)as fp:... ' –

+2

煩雑な* .lower().endswith()*を繰り返す代わりに、* os.path.splitext()*を使うことができます。 – guidot

答えて

8

一つの方法は、次のようになります。

def test(file_name): 
    loader = None 
    if file_name.lower().endswith('.gz'): 
     loader = gzip.open 
    elif file_name.lower().endswith('.csv'): 
     loader = open 

    if loader is not None: 
     with loader(file_name) as f: 
      f_csv = csv.reader(i.TextIOWrapper(f)) 
      #### Same Code 
0
def test(file_name): 
    f = None 
    if file_name.lower().endswith('.gz'): 
     f = gzip.open(file_name) 

    if file_name.lower().endswith('.csv'): 
     f = open(file_name) 

    if f is not None: 
     f_csv = csv.reader(i.TextIOWrapper(f)) 
     #### Same Code 
     f.close() 
0

あなたは、コードの簡潔さを気にする場合は、あなたがこれを行うことができます:辞書に

def test(file_name): 
    open_fnc = { '.gz' : gzip.open, '.csv' : open } 
    f_csv = csv.reader(i.TextIOWrapper(open_fnc[file_name.lower()[-3:]]())) 

ストアあなたの機能を、右の1を呼び出しますファイル名拡張子で索引付けします。ファイルに拡張子がない場合、これは失敗します。


拡張子の欠如は、エラーが発生しないことを確認したい場合は、gzip圧縮されたもの以外のすべての種類のファイルを扱うデフォルト(たとえば、open)であることを一つの機能を割り当てることができます。

from collections import defaultdict 
def test(file_name): 
    open_fnc = defaultdict(open) 
    open_fnc['.gz'] = gzip.open 
    f_csv = csv.reader(i.TextIOWrapper(open_fnc[file_name.lower()[-3:]]())) # will invoke `open` for anything besides `.gz` files. 
関連する問題