Python - Python problemas de lectura archivo .json

   
Vista:

Python problemas de lectura archivo .json

Publicado por christian (2 intervenciones) el 21/03/2016 22:17:14
Hola, estoy empezando con temas de programación, creando un pequeño videojuego con python y la librería pygame.
Uso un editor de mapas Tile_Map_Editor, para el desarrollo de las escenas, estos me vienen empaquetados en unos archivos .json para que yo pueda manipularlos en python.
Pero cuando intento en un bucle for ir leyendo los valores para guardarlos en una variable me sale une error de KeyError: 'data', no entiendo en que me equivoco recorriendo
estos diccionarios.
Eh ido mirando los pasos de código, y consigo ver que el for recorre un par de veces ,recogiendo los valores y almacenadolos en la variable creada ((("aunque no se si los sobrescribe"))), pero cuando a recorrido el for un par de veces me sale este error.
En que me equivoco???????????
Muchas gracias y saludos



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#Juego_Warhammer_Pruevas_0
import pygame
from pygame.locals import *
import base64
import StringIO
import gzip
import json
import sys
 
_tileWidth=0
_widthMapa=0
_heighMapa=0
_tileHeight=0
_matrizMapa=[]
 
 
def cargar_mapa(Nivel):
    global _widthMapa,_heighMapa,_tileWidth,_tileHeight,_matrizMapa
 
    c= open(Nivel+".json","r")
    data = json.load(c)
    c.close()
 
    _tileWidth=data["tilewidth"]
    _tileHeight=data["tileheight"]
    _withMapa =data["width"]
    _heighMapa=data["height"]
 
    print data["layers"]
    print type(data)
 
    for item in data ["layers"]:
            mapa=item["data"]
 
    '''Aqui no llega'''
 
    print mapa
    print type()
    mapa =base64.decodestring(mapa)
 
    #print mapa
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Python problemas de lectura archivo .json

Publicado por Christian (2 intervenciones) el 25/03/2016 12:26:07
hola otra vez,el problema anterior lo arregle importando otro tipo de archivo y reaciendo el codigo, ya que el editor que uso pa crear mi archivo .json no parecía que me lo importara bien.

cuando abri el .json { "height":38,
"layers":[
{
"data":[15, 16, 15, 16, 15, 16, 15, 16, 15, 16, 15, 16, 15, 16, 15, 16, 15, 16, 15, 1.............................................................]
"height":38,
"name":"suelo_batalla",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":60,
"x":0,
"y":0
},

en cambio tendría que ser una cosa así:

{ "height":15,
"layers":[
{
"compression":"zlib",
"data":"eJzV1EOUGIYahuFpbNvWZGLbtm1PJqxi22mDNjYnZpu0sdEmbdDGTmcmNu+.................................\/6D2265qE=",
"encoding":"base64",
"height":15,
"name":"Cielo",
"opacity":1,
"type":"tilelayer",
"visible":true,
"width":67,
"x":0,

Supongo que tenia error al leer el archivo, ya que no esperaba encontrarse en un tipo lista

Pero sigo teniendo problemas al recorrer bucles for, ya que cuando creo un objeto lo inicializo con .

def __init__(self, nombre):
self.nombre = nombre
self.capas = []
# Cargamos el mapa en self.capas.
self._cargar_mapa() # Inicializa los valores desde el xml.

# Obtenemos un array unidimensional con todos los tilesets del mapa.
self.tileset = cortar_tileset("data/imagenes/" + self.tileset, self.tam_tiles)

#self.crear_mapa()
#print self.mapa
#print self.capas

# Extrae valores mapa desde XML.

def _cargar_mapa(self):
xmlMap = minidom.parse(self.nombre) # Creo el archivo xml y se comproueva
nPrincipal = xmlMap.childNodes[0] # creo objeto con todas los nodos que contiene
self.width = int(nPrincipal.attributes.get("width").value) #anchura del mapa
self.height = int(nPrincipal.attributes.get("height").value) #altura del mapa

for i in range(len(nPrincipal.childNodes)): #recorremos todos los nodos principales "uno seguro"
if nPrincipal.childNodes[i].nodeType == 1: #reocorremos los subnodos que sean de tipo 1 ===ELEMENT_NODES
if nPrincipal.childNodes[i].nodeName == "tileset":
if nPrincipal.childNodes[i].attributes.get("name").value != "config":
width = nPrincipal.childNodes[i].attributes.get("tilewidth").value #anchura de las tiles
height = nPrincipal.childNodes[i].attributes.get("tileheight").value #altura de las tiles
nombre = nPrincipal.childNodes[i].childNodes[1].attributes.get("source").value #nombre del archivo .png de las tiles
nombre = extraer_nombre(nombre) #coje el nombre sin la ruta de este
self.tileset = nombre #creo atributo con el nombre del archivo
self.tam_tiles = (int(width), int(height)) #atributo del tamanyo de ls tiles

if nPrincipal.childNodes[i].nodeName == "layer":
layer = nPrincipal.childNodes[i].childNodes[1].childNodes[0].data.replace("\n", "").replace(" ", "") # le saco espacios
layer = self._decodificar(layer) # Decodifica la lista
layer = self.convertir(layer, self.width) # Convierta en array bidimensional
self.capas.append(layer) #anyadimos este valor a la lista
if nPrincipal.childNodes[i].nodeName == "objectgroup": #posicion donde empieza
x = nPrincipal.childNodes[i].childNodes[1].attributes.get("x").value
y = nPrincipal.childNodes[i].childNodes[1].attributes.get("y").value
self.start = (int(x), int(y)) #atributo donde empieza a dibujar


def crear_mapa(self):
self.mapa = self.capas
for m in range(len(self.capas)):
for n in range(self.height):
for q in range(self.width):
if self.capas[m][n][q]:
self.mapa[m][n][q].append (self.tileset[self.capas[m][n][q]])
else
self.mapa[m][n][q] = None





______Funcion_en otro en modulo____






def cortar_tileset(ruta, (w, h)):

image = cargar_imagen(ruta, True)
rect = image.get_rect()
col = rect.w / w
fil = rect.h / h
sprite = [None]

for f in range(fil):
for c in range(col):
sprite.append(image.subsurface((rect.left, rect.top, w, h)))
rect.left += w
rect.top += h
rect.left = 0
return sprite





Despues llamo al metodo cargar mapa ejecutando su función y me sale el error

self.mapa[m][n][q].append (self.tileset[self.capas[m][n][q]])
AttributeError: 'int' object has no attribute 'append'






Si cuando creo el objeto no ejecuto crear_mapa "en la inicialización lo pongo como comentario a la llamada del metodo,se me ejecuta bien y se me
imprime en panatalla el mapa que deseo, pero con el metodo crear_mapa por ahy me da error..

Supongo que aparte de novato soy un poco caotico, pero necesito que me ayuden.

Por cierto que significan estos 1,,,"ES DEL CODIGO ORIGNAL"""

def crear_mapa(self):
self.mapa = self.capas
for i in range(len(self.capas)):
for f in range(self.height):
for c in range(self.width):
if self.capas[i][f]1:
self.mapa[i][f]1 = self.tileset[self.capas[i][f]1]
else:
self.mapa[i][f]1 = None


Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar