在发生器内返回参数

Isl*_*arf 5 python json generator readfile

我知道有一个类似的问题已经被问过,但没有回答我的需要,因为我的情况有点不同.

我的代码:

def tFileRead(fileName, JSON=False):
    with open(fileName) as f:
        if JSON:
            return json.load(f)
        for line in f:
            yield line.rstrip('\n')
Run Code Online (Sandbox Code Playgroud)

我想做什么:如果JSON是真的,它意味着它从json文件中读取并且我想返回json.load(f),否则,我想将文件的行放到生成器中.

我已经尝试过将生成器转换为json的替代方案,但是它非常混乱,非常快,而且效果不好.

Wom*_*atz 2

我想到的第一个解决方案是显式返回一个生成器对象,它将提供您尝试实现的确切行为。

问题是:如果您显式返回这样的生成器对象,return (line.rstrip('\n') for line in f)则文件将在返回后关闭,并且从文件中进一步读取将引发异常。

您应该在这里编写两个函数:一个用于读取 json 文件,另一个用于读取普通文件。然后,您可以编写一个包装器,根据参数决定要调用这两个函数中的哪一个。

或者只是将迭代部分移动到另一个函数中,如下所示:

def iterate_file(file_name):
    with open(file_name) as fin:
        for line in fin:
            yield line.rstrip("\n")


def file_read(file_name, as_json=False):
    if as_json:
        with open(file_name) as fin:
            return json.load(fin)
    else:
        return iterate_file(file_name)
Run Code Online (Sandbox Code Playgroud)