我正在使用Python 2.7和
因此,问题可能是对自身的递归调用,但即使如此,它也只应从原始对象中删除。我不确定如何避免递归(或者这是否是正确的策略),但由于它是一个.plist文件,我确实需要能够识别何时出现字典或列表,并在搜索中迭代它们以寻找(a)更多要搜索的字典,或(b)需要删除的导入.plist中的实际键值对。
最终,这是一个部分性的非问题,因为我将定期使用的文件具有已知的结构。然而,我真的希望创建一些东西,不关心正在处理的对象的嵌套或顺序,只要它是一个带有数组的Python字典即可。
plistlib
来以嵌套的字典/数组形式导入.plist文件,然后查找特定的键并删除它。对于我们在办公室使用的实际文件,我已经知道如何找到这些值--但我编写脚本的想法是如果文件结构发生变化或我们需要对其他类似的文件进行同样的操作,我就不必在将来进行更改。不幸的是,我似乎正在尝试在迭代过程中修改字典,但我不确定实际上发生了什么,因为我正在使用iteritems()
和enumerate()
来获取生成器并与其一起工作,而不是直接使用对象。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)更多要搜索的字典,或(b)需要删除的导入.plist中的实际键值对。
最终,这是一个部分性的非问题,因为我将定期使用的文件具有已知的结构。然而,我真的希望创建一些东西,不关心正在处理的对象的嵌套或顺序,只要它是一个带有数组的Python字典即可。