根据文件是否为 .gz 打开文件

open file depending on whether it's .gz or not

我正在尝试找出打开 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

是否有更好的方法来做到这一点,也许使用生成器?谢谢

我觉得这样至少好一点:

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 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

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

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