打开文件取决于它是否是.gz

时间:2017-01-07 19:42:02

标签: python with-statement

我正在试图弄清楚打开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

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

3 个答案:

答案 0 :(得分:5)

你应该将开头和阅读分开:

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

答案 1 :(得分: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)

答案 2 :(得分: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