Formati file 3: JSON e XML¶

Riferimenti: SoftPython - formati 3

  • visualizza al meglio in
  • versione stampabile: clicca qua
  • per navigare nelle slide: premere Esc


Summer School Data Science 2023 - Modulo 1 informatica: Moodle

Docente: David Leoni david.leoni@unitn.it

Esercitatore: Luca Bosotti luca.bosotti@studenti.unitn.it

JSON¶

file di testo

formato più elaborato ad albero

profondità arbitraria

schema non necessario

molto diffuso in applicazioni web

Riferimenti:

SoftPython Formati 3 - JSON

[
  {
    "name": "Grazioli",
    "address": "Piazza Grazioli - Lavis",
    "slots": 7,
    "position": [
      46.139732902099794,
      11.111516155225331
    ]
  },
  {
    "name": "Pressano",
    "address": "Piazza della Croce - Pressano",
    "slots": 5,
    "position": [
      46.15368174037716,
      11.106601229430453
    ]
  }
]
import json
from pprint import pprint

with open('bike-sharing-lavis.json',  
          encoding='utf-8') as f:    

    contenuto_python = json.load(f)
    pprint(contenuto_python)
[{'address': 'Piazza Grazioli',
  'bikes': 3,
  'name': 'Grazioli',
  'position': [46.139, 11.111],
  'slots': 7},
 {'address': 'Piazza della Croce',
  'bikes': 2,
  'name': 'Pressano',
  'position': [46.153, 11.106],
  'slots': 5},
 .
 .
]

JSON E Python 1/2¶

  • molto simile a strutture dati in Python

  • numeri interi, float, stringhe, liste e dizionari

  • unica differenza: campi null del JSON che diventano None in Python

  • Per caricare: modulo già pronto json, con la funzione json.load

JSON E Python 2/2¶

contenuto_python[0]

{'address': 'Piazza Grazioli',
  'bikes': 3,
  'name': 'Grazioli',
  'position': [46.139, 11.111],
  'slots': 7}
contenuto_python[0]['address']
'Piazza Grazioli'
contenuto_python[0]['position']
[46.139732902099794, 11.111516155225331]

JSONL¶

Particolare tipo di file JSON

  • Nota L alla fine

File di testo contenente una sequenza di linee

  • ciascuna rappresenta un oggetto valido json

Si può trovare per file grossi o in streaming

impiegati.jsonl :

{"nome": "Mario", "cognome":"Rossi"}
{"nome": "Paolo", "cognome":"Bianchi"}
{"nome": "Luca", "cognome":"Verdi"}

impiegati.jsonl :

{"nome": "Mario", "cognome":"Rossi"}
{"nome": "Paolo", "cognome":"Bianchi"}
{"nome": "Luca", "cognome":"Verdi"}
In [4]:
import json

with open('./impiegati.jsonl', encoding='utf-8',) as f:

    i = 0
    for linea_testo in f:  # interpreta come file di testo
        contenuto_python = json.loads(linea_testo)  # converte linea di testo 
                                                    # in vero oggetto python 
        print('Oggetto ', i)
        print(contenuto_python)
        i = i + 1
        
Oggetto  0
{'nome': 'Mario', 'cognome': 'Rossi'}
Oggetto  1
{'nome': 'Paolo', 'cognome': 'Bianchi'}
Oggetto  2
{'nome': 'Luca', 'cognome': 'Verdi'}

XML (menzione)¶

Formato ad albero, più complesso dei json

  • File di testo .xml

  • nodi <TAG> CONTENUTO </TAG>

  • supporta attributi anche per i nodi (metadati)

   <TAG ATTR1="bla" ATTR2="bla">

Tipicamente fornito di schema

  • il linguaggio HTML per le pagine web segue lo standard XML

Per scansionare XML e HTML in Python:

  • Libreria beautiful soup
  • Tutorial estrazione da SoftPython
<div class="moodbo text-white">
    <div>
        <h4 class="headline">
            Coppa del Mondo di Snowboard
        </h4>
        <span class="abc">14/12/2017</span>
        <span class="moodboard">
            <span class="icon fz20"></span> 
            Passo Costalunga
        </span>
    </div>
    <div class="text-right">
        <a href="visit">
            <span class="icon fz30">
            </span>
        </a>
    </div>
</div>
In [1]: