Modificando plist en Python

Con plistlib puedo serializar una estructura de diccionario/lista en una plist. Esto funciona bien y también puedo volver a leerlo con la misma biblioteca.

El problema es que los diccionarios son del tipo "_internalDict" y parece que no puedo cambiarlos. Por ejemplo, por ejemplo:

d = plistlib.readPlist('someplist.plist')
v = d['value'] # v is an _internalDict
v['val'] = 'new val' # works
del v # doesn't work
v = {'someotherkey': 'someothervalue'} # doesn't work either

El plist no parece cambiar. ¿Ayudar?

preguntado el 12 de junio de 12 a las 15:06

del v borra todo el diccionario, y v = {...} crea un nuevo diccionario. ¿Es eso lo que quieres, o estás tratando de eliminar claves del dictado? El _InternalDict es solo un dict subclase que sale normal dict operaciones en su lugar. -

si, esto es lo que quiero -

Entonces no tienes problema, en mi opinión; ¿Recibes errores cuando eliminas todo el diccionario o cuando lo reemplazas por uno nuevo? plistlib puede lidiar con dictados regulares muy bien, por cierto. -

No recibo ningún error, elimino la referencia y en la siguiente línea todavía está allí. lo reemplacé todo junto y sigue siendo el viejo :/ -

Sí, hizo clic en lo que está tratando de hacer y dónde radica su malentendido. -

1 Respuestas

Deberá eliminar la clave de la d dictar:

del d['value']

Configurando v = d['value'] solo está creando una nueva variable que apunta al mismo valor que d['value'], pero eliminando v no eliminará el dict de la estructura principal.

Para reemplazar el dictado por completo, nuevamente debe manipular el dictado principal:

d['value'] = { 'foo': 'bar' }

Si ejecuta v = { ... } lo que estás haciendo es asignar una referencia a un nuevo dict valor a la variable v, reemplazando la referencia a la d['value'] dict; no está manipulando el valor original en el d dic.

plistlib._InternalDict es solo una subclase de dict que da advertencias para el acceso a los atributos, que ahora está en desuso; de lo contrario, actúa como un regular dict tipo.

Respondido el 12 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.