Как использовать лямбду для сравнения размеров файлов, когда на входе находится список файлов? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть функция, которая задает 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 не содержит '*', иначе сравните размер (A) с каждым из значений размера (glob.glob (B)).Один вариант, о котором я думаю, - это сравнить все файлы в B, используя reduce, а затем, если то же самое, сравнить с A, но я не знаю, как

1 Ответ

0 голосов
/ 20 декабря 2018

Один из способов избежать этого - библиотека pathlib2 (обратный порт pathlib в стандартной библиотеке Python3).Чтобы получить размер файла, вы можете сделать Path('file').stat().st_size, и он также поддерживает Glob в виде Path('parent').glob('star_pattern').

Так что, возможно, что-то вроде

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))

Хотя я неуверен, как проверить это на вашем примере.

...