Я использую Python 2.7 с plistlib
, чтобы импортировать .plist в вложенной форме dict/array, затем найдите конкретный ключ и удалите его, где бы я его ни увидел.python - рекурсивно удаляет ключи dict?
Когда дело доходит до фактических файлов, с которыми мы работаем в офисе, я уже знаю, где найти значения, но я написал свой сценарий с идеей, что я этого не сделал, в надежде, что я не буду «Вносить изменения в будущем, если структура файла изменится, или мы должны сделать то же самое с другими подобными файлами.
К сожалению, я пытаюсь изменить dict во время итерации по нему, но я не уверен, как это происходит на самом деле, поскольку я использую iteritems()
и enumerate()
, чтобы получить генераторы и работать с ними вместо объекта I Я действительно работаю.
def scrub(someobject, badvalue='_default'): ##_default isn't the real variable
"""Walks the structure of a plistlib-created dict and finds all the badvalues and viciously eliminates them.
Can optionally be passed a different key to search for."""
count = 0
try:
iterator = someobject.iteritems()
except AttributeError:
iterator = enumerate(someobject)
for key, value in iterator:
try:
scrub(value)
except:
pass
if key == badvalue:
del someobject[key]
count += 1
return "Removed {count} instances of {badvalue} from {file}.".format(count=count, badvalue=badvalue, file=file)
К сожалению, когда я запускаю это в моем файле тест .plist, я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "formscrub.py", line 45, in <module>
scrub(loadedplist)
File "formscrub.py", line 19, in scrub
for key, value in iterator:
RuntimeError: dictionary changed size during iteration
Таким образом, проблема может быть рекурсивным вызовом самому себе, но даже тогда не должна он просто удаляется из исходного объекта? Я не уверен, как избежать рекурсии (или если это правильная стратегия), но поскольку это - .plist, мне нужно определить, когда вещи являются диктофонами или списками, и перебирать их в поисках (a) более dicts для поиска или (b) фактическая пара ключ-значение в импортированном .plist, которую мне нужно удалить.
В конечном счете, это частично без проблем, поскольку файлы, с которыми я буду работать регулярно, имеют известную структуру. Тем не менее, я действительно надеялся создать что-то, что не заботится о гнездовании или порядке объекта, с которым он работает, до тех пор, пока он является питоном Python с массивами в нем.
Что именно вопрос? – jdotjdot
Ah geez:/i даже не попал в соответствующую загадку –