当输入是文件列表时,如何使用lambda比较文件大小?

时间:2018-12-20 14:46:43

标签: python python-2.7 lambda reduce

我有一个汇总2个文件路径的函数:

def f(local, remote):

remote路径可以是简单的a/b/c,也可以是更复杂的a*/b/c*。例如,如果我想检查remote文件是否存在,可以使用lambda

apply_on_star = lambda func, path : map(func, glob.glob(path)) if '*' in path else func(path)
# and call it with:
any(apply_on_star(os.path.isfile, remote_path))

但是,如果我要检查文件的大小,则使用的是os.stat(path).st_size,而我不确定如何插入lambda

我最后想要的是这样的:lambda compare_sizes file_A, file_B_may_contain_star : os.stat(file_A ).st_size == apply_on_star(os.stat.st_size, file_B_may_contain_star)

其中内部apply_on_star将获得file_B_may_contain_star中每个文件的大小,但这将不起作用。 reducelambda或其他内容在这里有用还是必须在函数中编写?

只是要澄清-我想采用2条路径,A,B,其中B可能包含'*',并检查size(A)== size(B)如果B不包含'*',否则将size(A)与size(glob.glob(B))中的每一个进行比较。我想到的一种选择是使用reduce比较B中的所有文件,然后如果比较,则与A比较,但是我不知道如何

1 个答案:

答案 0 :(得分:0)

pathlib2库(Python3标准库中pathlib的反向端口)可能是摆脱这种情况的一种方法。要获取文件的大小,可以执行Path('file').stat().st_size,它也支持Path('parent').glob('star_pattern')形式的Glob。

所以也许像

from pathlib2 import Path

def compare_sizes(file_a, file_b_may_glob):
    size_a = Path(file_a).stat().st_size
    sizes_b =[fp.stat().st_size for fp in Path().glob(file_b_may_glob)]
    return any(size_a==size_b in sizes_b)

# or, as a lambda
lambda file_a, file_b_may_glob: any(Path(file_a).stat().st_size == fp.stat().st_size for fp in Path().glob(file_b_may_glob))

尽管我不确定如何针对您的示例进行测试。