2013-02-13 10 views
10

Ho appena iniziato a utilizzare PyYAML per convertire alcuni dati.Disabilita conversione valore PyYAML

Ho appena usato la funzione yaml.load ed è stato abbastanza buono per me finché non ho notato che tenta di convertire tutti i valori in stringhe, int, date e così via.

Questo potrebbe essere fatale nella mia applicazione, c'è un modo per evitare questa conversione? Mi piacerebbe ricevere tutto come stringhe. Ho esaminato i costruttori e non sono riuscito a trovare un modo per disabilitare questa conversione.

aggiornamento: Quello che ottengo da yaml.load è un OrderedDict e tutto sembra a posto. l'unico problema è che alcuni valori sono string, e alcuni sono int. Mi piacerebbe avere tutti i valori come stringhe. Non voglio che pyyaml ​​converta i valori per me.

+0

allora non siete decodifica YAML. Inoltre, ** cosa esattamente ** vuoi lasciare come stringhe e cosa no? Se lasci * tutto * una stringa, vuoi 'the_file.read()' ;-) – delnan

+0

Il file che sto usando pyyaml ​​per analizzare non è in realtà yaml ma è abbastanza vicino. Pertanto voglio evitare la conversione del tipo. – theAlse

+0

Ma * quale * tipo di conversione di tipo? Vuoi ricevere le liste? Dizionari? Vuoi convertire i booleani? Galleggianti? A profondità arbitraria o con un formato fisso? Così com'è, questo è troppo sottodeterminato. – delnan

risposta

22

Beh, si potrebbe utilizzare Loader=yaml.BaseLoader di lasciare tutto come una stringa:

>>> x = [[1,2,3], {1:2}] 
>>> s = yaml.dump(x) 
>>> s 
'- [1, 2, 3]\n- {1: 2}\n' 
>>> yaml.load(s) 
[[1, 2, 3], {1: 2}] 
>>> yaml.load(s, Loader=yaml.BaseLoader) 
[[u'1', u'2', u'3'], {u'1': u'2'}] 
+1

Attenzione: mentre questo disabilita la conversione automatica del valore, sembra anche che la chiave di fusione "<<" non funzioni più su un singolo livello (ad esempio "<<" - unendo un nodo di ancoraggio che è anch'esso "<< "-dura che altri nodi di ancoraggio non funzionino più) - testati su PyYAML 3.10 e 3.11 – voetsjoeba