Как проверить существование файла из большого массива имен файлов и удалить имя файла из массива, если оно не существует согласованным образом?

#python #arrays #python-3.x #file

#python #массивы #python-3.x #файл

Вопрос:

Я пытаюсь использовать массив метаданных, содержащий имена файлов, в проекте ML, проблема в том, что некоторые файлы недоступны в моем дисковом хранилище. Моя цель — удалить несуществующие файлы из массива, проверив, доступен ли файл или нет. Я написал этот фрагмент кода на python:

 for file in meta:
try:
    f = open(data_path   file, 'r')
    f.close()
except: 
    meta.remove(file)
  

Код, кажется, работает, но не является последовательным, я могу запускать его несколько раз подряд, и это каждый раз уменьшало бы длину meta. (например: исходный len (meta) = 65296, после 1 итерации len (meta) = 62020, после 2 итерации len (meta) = 60653 и т.д. )

Есть ли причина, по которой мой код не удаляет все несуществующие файлы за один раз? Есть ли более последовательный способ достижения моей цели?

Ответ №1:

 from os import path
meta = ['path/to/file1','path/to/file2','path/to/filen']
new_meta = [f for f in meta if path.exists(f)]
  

Комментарии:

1. Большое спасибо за ответ, он очень похож на ответ от @stilManiac, но немного более элегантный, я применю это к своему коду!

2. @Vylly Я рад, что смог помочь. Не стесняйтесь голосовать.

Ответ №2:

Я не уверен, что я следую тому, что вы хотите сделать, но никогда не меняйте последовательность, которую вы используете во время итерации. Используйте что-то вроде этого:

 new_meta = meta
for file in meta:
    try:
        f = open(data_path   file, 'r')
        f.close()
    except:
        # new sequence, not the original one
        new_meta.remove(file)
  

Более последовательный способ, я считаю:

 from os import path
new_meta = meta
for file in meta:
    if not path.exists(data_path   file):
        new_meta.remove(file)
  

Комментарии:

1. Спасибо за эти советы, я действительно ценю это, это действительно более согласованно и отлично работает!