解析只返回第一个文件

时间:2016-12-19 21:26:31

标签: python python-2.7 parsing io

我编写了一个函数,它应该读取目录中的每个文件,并将字符串存储在我已解析的列表中。但是在运行时它只返回第一个文件。我不知道为什么会这样做,但在我将它存储为变量并且刚打印之前它工作正常。但是现在当我将其保存为列表时,它会在第一个文件处停止。有人可以帮忙吗?

CODE:

def ParseFiles(path):
    for filename in os.listdir(path):
        if filename.endswith(('.cfg', '.startup', '.confg')):
            file_name = os.path.join(path, filename)
            with open(file_name, "r") as in_file:
                for line in in_file:
                    match = re.search('^hostname\s(\S+)$', line)
                    if match:
                        hostname = [match.group(1)]
                        return hostname
                        #print hostname

2 个答案:

答案 0 :(得分:2)

print不同,return语句结束了函数的执行。

如果你想从所有结果中创建一个列表,你应该在循环之前创建它,逐个添加元素,然后返回整个列表:

def ParseFiles(path):
    results = []
    for filename in os.listdir(path):
        if filename.endswith(('.cfg', '.startup', '.confg')):
            file_name = os.path.join(path, filename)
            with open(file_name, "r") as in_file:
                for line in in_file:
                    match = re.search('^hostname\s(\S+)$', line)
                    if match:
                        # Add result to the list we created earlier
                        results.append(match.group(1))
    # Now return the whole list
    return results

稍微更高级的解决方案是创建一个生成器:

def ParseFiles(path):
    for filename in os.listdir(path):
        if filename.endswith(('.cfg', '.startup', '.confg')):
            file_name = os.path.join(path, filename)
            with open(file_name, "r") as in_file:
                for line in in_file:
                    match = re.search('^hostname\s(\S+)$', line)
                    if match:
                        # Yields a single result out, but doesn't end the execution
                        yield match.group(1)

现在使用它:

for host in ParseFiles(my_path):
    # do something with 'host'
    print host

此外,它通常是Python中的惯例,使用下划线格式化函数和变量的名称 - 例如parse_files() Camel大小写保留给类名 - MyClass

答案 1 :(得分:1)

alecxe是正确的。您正在从函数返回,因此如果您在第一个文件中有匹配项并且它永远不会返回以检查其他文件,则它将完成执行。

这实际上取决于你想做什么,但我假设你想收集你在文件中找到的主机名。

所以你可以这样做,

N

这样,您将返回所有文件中匹配的主机名列表。