Foros del Web » Programando para Internet » Python »

leer multiples json, comprobar url, crear json

Estas en el tema de leer multiples json, comprobar url, crear json en el foro de Python en Foros del Web. Hola No estoy seguro si es el sitio correcto sino lo es disculpadme, pero va de python. Os expongo el tema. Tengo un directorio que ...
  #1 (permalink)  
Antiguo 04/01/2014, 21:25
Avatar de 23r9i0  
Fecha de Ingreso: noviembre-2008
Ubicación: Catalonia
Mensajes: 203
Antigüedad: 15 años, 5 meses
Puntos: 33
leer multiples json, comprobar url, crear json

Hola
No estoy seguro si es el sitio correcto sino lo es disculpadme, pero va de python.
Os expongo el tema.
Tengo un directorio que tiene múltiples subdirectorios y que algunos tienen un archivo json.
Necesito leerlos y extraer el primer valor para luego comprobar que existe en el servidor, solo comprobarlo, y si existe añadir el contenido del archivo json en otro archivo json que tendra todos los json unificados.
Una vez creado el json tengo que crear otro json que contendra los valores ordenados por un valor.

Actualmente uso walk, fnmatch para crear una lista con todas las direcciones de los archivos y luego con un with open y for escribo el nuevo json, pero me pierdo al no saber como estraer el valor del archivo y comprobarlo.

Uso Python 2.7.5 linux y este es mi codigo
Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os, fnmatch
  4.  
  5. m = []
  6.  
  7. for r, d, f in os.walk('directory'):
  8.     for p in fnmatch.filter(f, 'data.json'):
  9.         m.append(os.path.join(r, p))
  10. with open('list.json', 'w') as o:
  11.     o.write('[')
  12.     for (i,f) in enumerate(m):
  13.         o.write(''.join([l for l in open(f).readlines() if l.strip()]))
  14.         if i < (len(m)-1):
  15.             o.write(',')
  16.     o.write(']')

Hace muy poco que estoy con python asi que si creeis o sabeis otra manera de hacerlo os estaria agradecido de que compartieras tus conocimientos.
Gracias
  #2 (permalink)  
Antiguo 05/01/2014, 00:40
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: leer multiples json, comprobar url, crear json

Si, puedes usar json para manejar las estructuras como objetos en python y luego volverlos a escribir como archivos json.

Ejemplo, por favor llena con los huecos (comentarios) con lo que necesites hacer.
Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import fnmatch
  5. import json
  6.  
  7. json_files = []
  8. for r, d, f in os.walk('directory'):
  9.     for p in fnmatch.filter(f, 'data.json'):
  10.         json_files.append(os.path.join(r, p))
  11.  
  12. results = []
  13. for filename in json_files:
  14.     with open(filename, 'rb') as f:
  15.         try:
  16.             data = json.load(f)
  17.             # Aqui procesas los datos
  18.             # Agrega el resultado a results
  19.         except ValueError:
  20.             # ValueError, error al parsear el json
  21.             pass
  22.  
  23. # Ordena in-place
  24. # Puedes definirle alguna function key o cmp
  25. results.sort()
  26.  
  27. with open('list.json', 'wb') as f:
  28.     json.dump(results, f)
  #3 (permalink)  
Antiguo 05/01/2014, 08:59
Avatar de 23r9i0  
Fecha de Ingreso: noviembre-2008
Ubicación: Catalonia
Mensajes: 203
Antigüedad: 15 años, 5 meses
Puntos: 33
Respuesta: leer multiples json, comprobar url, crear json

Gracias razpeitia

Última edición por 23r9i0; 05/01/2014 a las 17:09 Razón: Eliminar contenido
  #4 (permalink)  
Antiguo 05/01/2014, 17:09
Avatar de 23r9i0  
Fecha de Ingreso: noviembre-2008
Ubicación: Catalonia
Mensajes: 203
Antigüedad: 15 años, 5 meses
Puntos: 33
Respuesta: leer multiples json, comprobar url, crear json

Tengo un par de dudas, problemas

- El script tarda aprox un minuto en completarse, diria que es mucho.
- Como puedo ordenar el json para que este ordenado por las categorias como lo tengo en existing.

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os, fnmatch, json, requests
  4.  
  5. json_files = []
  6. existing = {'Serif':[], 'Sans Serif':[], 'Display':[], 'Handwriting':[]} # Categorias
  7. include = ['name', 'fonts', 'fullName', 'style', 'weight', 'subsets']
  8.  
  9. def deleted_items(data, sub, inc):
  10.     for d in data.keys():
  11.         if not d in inc:
  12.             del(data[d])
  13.         if d == sub:
  14.             for subdata in data[d]:
  15.                 for x in subdata.keys():
  16.                     if not x in inc:
  17.                         del(subdata[x])
  18.     return data
  19.  
  20. for r, d, f in os.walk('googlefontdirectory'):
  21.     for p in fnmatch.filter(f, 'METADATA.json'):
  22.         json_files.append(os.path.join(r, p))
  23.  
  24. for filename in json_files: # len(json_files) = 724
  25.     with open(filename, 'rb') as f:
  26.         try:
  27.             data = json.load(f)
  28.             name = data['name'].replace(' ', '+')
  29.             url = 'http://www.google.com/fonts/specimen/' + name
  30.             resp = requests.head(url)
  31.             if 200 == resp.status_code:
  32.                 cat = data['category']
  33.                 data = deleted_items(data, 'fonts', include)
  34.                 existing[cat].append(data)
  35.         except ValueError:
  36.             pass
  37.  
  38. with open('existing.json', 'wb') as f:
  39.     json.dump(existing, f, indent=2)

Como vereis estoy recorriendo el directorio del googlefontdirectory creado mediante mercurial (hg) y al ser diferente del directorio de google fonts tengo que comprobar que fuente esta disponible para añadirla al json y luego elimino el contenido innecesario para no hacer un json mas grande de lo que deberia.

Última edición por 23r9i0; 05/01/2014 a las 17:16 Razón: Extender post
  #5 (permalink)  
Antiguo 05/01/2014, 17:26
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: leer multiples json, comprobar url, crear json

Cita:
Iniciado por 23r9i0 Ver Mensaje
- El script tarda aprox un minuto en completarse, diria que es mucho.
Es porque tu cuello de botella es que haces las peticiones http serializadas. En vez de en paralelo. Aun así se me hace un tiempo aceptable, asumiendo que no se ejecuta muy seguido este script.

Cita:
Iniciado por 23r9i0 Ver Mensaje
- Como puedo ordenar el json para que este ordenado por las categorias como lo tengo en existing.
Eso depende. Si una lista, si puedes lo ordenas con el método sort, si es un diccionario no puedes (de hecho es el punto de un diccionario).
  #6 (permalink)  
Antiguo 05/01/2014, 17:39
Avatar de 23r9i0  
Fecha de Ingreso: noviembre-2008
Ubicación: Catalonia
Mensajes: 203
Antigüedad: 15 años, 5 meses
Puntos: 33
Respuesta: leer multiples json, comprobar url, crear json

Gracias, ese script se ejecutaria una vez al mes para tener el listado actualizado, todo viene por que la api de google no tiene la opcion de ordenar por categorias, no se porque pero de momento no la hay.

Sobre el diccionario pensaba que al establecerlo de una manera se mantendria asi, de echo no tiene mucha importancia ya que luego desde php lo puedo ordenar que hay entiendo mas.

Etiquetas: ip, json, multiples, url
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:31.