2012-10-02 4 views
0

Je suis en train d'analyser un document JSON en Python et j'ai presque tout le processus pour travailler, sauf que j'ai du mal à convertir une chaîne GPS dans la bonne forme.Analyser les chaînes de json en Python

J'ai la forme suivante:

"gsx$gps":{"$t":"44°21′N 68°13′W\ufeff/\ufeff44.35°N 68.21°W\ufeff/44.35; -68.21\ufeff (Acadia)"} 

et qui est de ce formulaire HTML:

44°21′N 68°13′W/44.35°N 68.21°W/44.35; -68.21 (Acadia) 

et je veux que le produit final soit une chaîne qui ressemble à ceci:

(44.35, -68.21) 

Voici d'autres exemples de chaînes JSON pour vous donner plus de détails:

"gsx$gps":{"$t":"14°15′S 170°41′W\ufeff/\ufeff14.25°S 170.68°W\ufeff/-14.25; -170.68\ufeff (American Samoa)"} 

"gsx$gps":{"$t":"38°41′N 109°34′W\ufeff/\ufeff38.68°N 109.57°W\ufeff/38.68; -109.57\ufeff (Arches)"} 

Je donne les résultats suivants:

GPSlocation = entry['gsx$gps']['$t'] 

et je ne sais pas comment GPSlocation dans la forme que je veux ci-dessus.

+1

ce n'est pas parser json ... il a déjà un dict json construit ... son juste l'analyse du format ci-dessus à un tuple ... –

Répondre

1

pas super élégant mais il fonctionne ... aussi vous n'êtes pas ... analyse JSON analyse syntaxique juste une chaîne ...

import re 
center_part = GPSLocation.split("/")[1] 
N,W = centerpart.split() 
N,W = N.split("\xb0")[0],W.split("\xb0")[0] 
tpl = (N,W) 
print tpl 

sur une note de côté ce ne sont pas ints ...

+0

bien génial. oui je suis juste en train d'analyser une chaîne. cela me donne ce dont j'ai besoin mais qu'est-ce que le \ xb0 signifie exactement? – clifgray

+0

c'est le symbole du degré ... –

1

Here we go:

import json 
jstr = """{"gsx$gps":{"$t":"14°15′S 170°41′W\ufeff/\ufeff14.25°S 170.68°W\ufeff/-14.25; -170.68\ufeff (American Samoa)"}}""" 
a = json.loads(jstr) 
tuple(float(x) for x in a['gsx$gps']['$t'].split('/')[-1].split(u'\ufeff')[0].split(';')) 

donne:

(-14.25, -170.68) 

ou de la chaîne simple:

GPSlocation = u"14°15′S 170°41′W\ufeff/\ufeff14.25°S 170.68°W\ufeff/-14.25; -170.68\ufeff (American Samoa)" 
tuple(float(x) for x in GPSlocation.split('/')[-1].split(u'\ufeff')[0].split(';')) 

Certains de fantaisie timeit, pourquoi ne pas regexp fantaisie;)

import re 
import timeit 
setup='GPSlocation = u"14°15′S 170°41′W\ufeff/\ufeff14.25°S 170.68°W\ufeff/-14.25; -170.68\ufeff (American Samoa)"; import re' 
print timeit.timeit("map(float, GPSlocation.split('/')[-1].split(u'\ufeff')[0].split(';'))", setup=setup) 
print timeit.timeit("map(float, re.findall(r'(-?\d+(?:\.\d+)?)', GPSlocation)[-2:])", setup=setup) 

5.89355301857 
22.6919388771 
+0

avec GPSlocation tout ce que j'ai est cette chaîne: "14 ° 15'S 170 ° 41'W \ ufeff/\ ufeff14.25 ° S 170.68 ° W \ ufeff/-14.25; -170.68 \ ufeff (Samoa américaines) "mais je suppose que si je remonte cette étape, cela fonctionne – clifgray

+0

Ignorez simplement les deux premières lignes et remplacez' a ['gsx $ gps'] ['$ t'] 'par' GPSlocation'. – Michael

+0

Le seul problème que j'ai est que j'ai à l'origine est qu'il ne fait rien sur le symbole de degré et il ne peut pas encoder cela – clifgray

0

Vous pouvez extraire les données avec regex:

>>> import re 
>>> text = '''"gsx$gps":{"$t":"44?21?N 68?13?W\ufeff/\ufeff44.35?N 68.21?W\ufeff/44.35; -68.21\ufeff (Acadia)"}''' 
>>> map(float, re.findall(r'(-?\d+(?:\.\d+)?)', text)[-2:]) 
[44.35, -68.21] 
0
re.sub(r'.+/ (-?\d{1,3}\.\d\d); (-?\d{1,3}\.\d\d)\\.+', 
     "(\g<1>, \g<2>)", 
     "44°21′N 68°13′W\ufeff/\ufeff44.35°N 68.21°W\ufeff/44.35; -68.21\ufeff (Acadia)") 
+0

Cela semble avoir quelques problèmes, lorsque vous générez des chaînes Unicode. En plus de cela, je ne pense pas que l'idée était de produire les valeurs sous forme de chaîne, mais d'obtenir un tuple, où vous pouvez réellement travailler. – Michael