我有一个汇总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
中每个文件的大小,但这将不起作用。 reduce
或lambda
或其他内容在这里有用还是必须在函数中编写?
只是要澄清-我想采用2条路径,A,B,其中B可能包含'*',并检查size(A)== size(B)如果B不包含'*',否则将size(A)与size(glob.glob(B))中的每一个进行比较。我想到的一种选择是使用reduce
比较B中的所有文件,然后如果比较,则与A比较,但是我不知道如何
答案 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))
尽管我不确定如何针对您的示例进行测试。