2017-01-07 9 views
1

私は、pythonファイルを開く最良の方法がそのタイプに基づいているかを調べようとしています。ファイルが.gzであるかどうかに応じてファイルを開く

例えば、私はこれのような基本的なものを持っていますが、私には 'pythonic'のようには見えませんし、何らかの形でリファクタリングしてより洗練された感じがします。

def openfile(filename): 
    if read_file_from_top: 
     if not filename.endswith('.gz'): 
      with open(filename, 'r') as infile: 
       for line in infile: 
        # do something 
     else: 
      with gzip.open(filename, 'r') as infile: 
       for line in infile: 
        # do something 
    elif read_file_from_bottom: 
     if not filename.endswith('.gz'): 
      with open(filename, 'r') as infile: 
       for line in infile: 
        # do something 
     else: 
      with gzip.open(filename, 'r') as infile: 
       for line in infile: 
        # do something 

これを行うには、発電機を使用する方が良いでしょうか?ありがとう。

+1

'read_file_from_top'ブランチと' read_file_from_bottom'ブランチの違いは何ですか?そして、インデントを修正する必要があります(すべてが1つの関数であると仮定して)。 – jszakmeister

+1

インデントは、stackoverflowsエディタで自動的に行われましたが、何らかの理由でその関数を選択しませんでした。私はそれを修正するでしょう。 'read_file_from_top'と' read_file_from_bottom'は上か下からファイルを読み込みます。基本的に日付順に日付の束をたどっています。入力に応じて、下よりも上から読み込むほうが速いかもしれません。しかしこれは私が直面しているジレンマの一例です。 – user1165419

+0

この質問は、[コードレビュー](http://codereview.stackexchange.com/)のスタックエクスチェンジでより適切かもしれません。私が間違っているなら、私を修正してください。 – Tagc

答えて

2

あなたが開口部と読書区切る必要があります。重要な機能の定義済みリストを使用して

def openfile(filename, mode='r'): 
    if filename.endswith('.gz'): 
     return gzip.open(filename, mode): 
    else: 
     return open(filename, mode) 

with openfile(filename, 'r') as infile: 
    for line in infile: 
     # do something 
+0

良い答えは、 "モード"の後にコロンを編集して削除したかったが、これはエラーを生成するが1文字の編集はできない。 – jimh

2

私はこのようなものは、少なくとも少し優れていると思う:

import gzip 


def file_line_gen(filename): 
    if filename.endswith('.gz'): 
     open_fn = gzip.open 
    else: 
     open_fn = open 

    with open_fn(filename, 'r') as f: 
     for line in f: 
      yield line 


for line in file_line_gen('data.gz'): 
    # do something here 
    print repr(line) 
+0

私は三元を使っていましたが、はい、それが良いです。 –

+0

'read_file_from_top'と' read_file_from_bottom'の違いを考慮すると、これは半分に過ぎません。 – ppasler

+0

@ppasler彼が提供したコードは、2つのブランチ間で同じです。詳しい情報がなければ、そこに何を入れるべきかは不明です。 – jszakmeister

0

ショートソリューションを:

def processFile(filepath): 
    with [open, gzip.open][0 if not filepath.endswith('.gz') else 1](filepath, 'r') as fh: 
     if read_file_from_top: 
      # do something 
     elif read_file_from_bottom: 
      # do something 
関連する問題