У меня есть список путей к файлам listt:

['/data0/river_routes.nc',
 '/dat/rho0_profile.nc',...]

Я хочу проверить, существуют ли они, а если нет - создать список list1 только с путями отсутствующих файлов.

Я могу создать list1 полный True/False, используя:

import os,time
list1 = []
for file in listt:
    list1.append(os.path.isfile(file))

Но я не уверен, как создать список отсутствующих путей наиболее эффективным способом

0
ValientProcess 2 Июл 2019 в 15:42

4 ответа

Лучший ответ

Вам нужно добавить путь, а не bool, который возвращает isfile.

from os.path import isfile

paths = ['/data0/river_routes.nc', '/dat/rho0_profile.nc',...]

missing_paths = []
for path in paths:
    if not isfile(path):
        missing_paths.append(path)

Это также может быть сделано с использованием понимания списка:

missing_paths = [path for path in paths if not isfile(path)]

Или вы можете использовать itertools.filterfalse:

from itertools import filterfalse as ffilter
missing_paths = list(filter(ispath, paths))
2
Jab 2 Июл 2019 в 15:47

Просто вычтите множество найденных из всех:

import os
path = 'path/to/directory'
listt = ['/data0/river_routes.nc',
         '/dat/rho0_profile.nc',...]
all = set(listt)
found = set(os.listdir(path))
missing = list(all - found)
1
Kshitij Saxena 2 Июл 2019 в 12:50

Попробуй это:

from pathlib import Path

if __name__ == '__main__':
    paths = ['/data0/river_routes.nc',
             '/dat/rho0_profile.nc']
    missing = []
    for item in paths:
        p = Path(item)
        if not p.exists():
            missing.append(item)

2
abdusco 2 Июл 2019 в 12:44

Вы можете использовать понимание списка

import os

not_exists = [f for f in list1 if not os.path.exists(f)]

Где list1 - список с путями

1
Kamrus 2 Июл 2019 в 13:06