打开时打开的返回文件句柄?

The*_*Cat 6 python with-statement

我正在创建我想接受压缩文件的软件.由于文件是在任何地方读/写的,我创建了一个实用程序函数,用于打开文件,为我处理打开/关闭某些压缩文件类型.

示例代码:

def return_file_handle(input_file, open_mode="r"):
    """ Handles compressed and uncompressed files. Accepts open modes r/w/w+ """

    if input_file.endswith(".gz")
        with gzip.open(input_file, open_mode) as gzipped_file_handle:
            return gzipped_file_handle
Run Code Online (Sandbox Code Playgroud)

问题是,当使用此代码时,文件句柄似乎在函数返回时关闭.我有可能做我想做的with open事情或者我需要处理自己关闭?

将其添加到上面的代码中以获得最小的非工作示例:

for line in return_file_handle(input_bed, "rb"):
    print line
Run Code Online (Sandbox Code Playgroud)

创建一个gzip压缩文本文件:

echo "hei\nder!" | gzip - > test.gz
Run Code Online (Sandbox Code Playgroud)

错误信息:

Traceback (most recent call last):
  File "check_bed_against_blacklist.py", line 26, in <module>
    check_bed_against_blacklist("test.gz", "bla")
  File "check_bed_against_blacklist.py", line 15, in check_bed_against_blacklist
    for line in return_file_handle(input_bed, "r"):
ValueError: I/O operation on closed file.
Run Code Online (Sandbox Code Playgroud)

sal*_*ise 13

尝试将其作为发电机:

def return_file_handle(input_file, open_mode="r"):
""" Handles compressed and uncompressed files. Accepts open modes r/w/w+ """

    if input_file.endswith(".gz")
        with gzip.open(input_file, open_mode) as gzipped_file_handle:
            yield gzipped_file_handle
Run Code Online (Sandbox Code Playgroud)

当你打电话时:

for line in return_file_handle("file.gz"):
    print line.read()
Run Code Online (Sandbox Code Playgroud)