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
1
2
3
4
5
6
7
8
9
10
11
12
13
{ "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í:

1
2
3
4
5
6
7
8
9
10
11
12
13
{ "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 .

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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


Después llamo al método cargar mapa ejecutando su función y me sale el error

1
2
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"""

1
2
3
4
5
6
7
8
9
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