打开文件,具体取决于文件是否.gz



我试图根据其类型找出打开python文件的最佳方法。

例如,我有这样的基本东西,但它对我来说似乎并不"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

有没有更好的方法来做到这一点,也许使用发电机?谢谢。

你应该把开头和读法分开:

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

我认为这样的事情至少好一点:

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)

使用预定义的关键函数列表的简短解决方案:

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

最新更新