Modificando plist en Python
Frecuentes
Visto 2,472 veces
0
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?
1 Respuestas
3
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 python plist or haz tu propia pregunta.
del v
borra todo el diccionario, yv = {...}
crea un nuevo diccionario. ¿Es eso lo que quieres, o estás tratando de eliminar claves del dictado? El_InternalDict
es solo undict
subclase que sale normaldict
operaciones en su lugar. - Martijn Pieterssi, esto es lo que quiero - pistacchio
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. - Martijn PietersNo 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 :/ - pistacchio
Sí, hizo clic en lo que está tratando de hacer y dónde radica su malentendido. - Martijn Pieters