#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. Спасибо за эти советы, я действительно ценю это, это действительно более согласованно и отлично работает!