2012-10-02 163 views
0

我解析的是Python中的JSON文档,除了我将GPS字符串转换为正确的格式之外,我几乎要完成整个过程才能工作。在Python中解析json的字符串

我有以下形式:

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

,这是从这个HTML表单:

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

,我想最终产品是一个字符串,它看起来像这样:

(44.35, -68.21) 

这里有几个其他示例JSON字符串,只是为了给你更多的工作:

"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)"} 

我有以下几点:

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

,然后我不知道怎么去GPSlocation到我上面想要的形式。

+1

这不是解析JSON ...他已经有一个JSON内置字典...它只是解析上面的格式到一个元组... –

回答

1

不是超级优雅,但它的工作原理......你也不能解析JSON ...只是解析字符串...

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 

在一个侧面说明这些都不是整数...

+0

好吧巨大的。是的,我只是解析一个字符串。这给了我我需要的东西,但是\ xb0符号化到底是什么? – clifgray

+0

那是度数符号... –

1

这里,我们去:

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(';')) 

给出:

(-14.25, -170.68) 

还是从纯字符串:

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(';')) 

一些timeit看中了,为什么要避免花哨的正则表达式;)

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

与GPSlocation所有我有这串:“14°15'S 170°41'W \ ufeff/\ ufeff14.25°S 170.68°W \ ufeff/-14.25; -170.68 \ ufeff(美属萨摩亚)“,但我想如果我回去这一步工作 – clifgray

+0

只需忽略前两行,并用'GPSlocation'替换'a ['gsx $ gps'] ['$ t']'。 – Michael

+0

我最初遇到的唯一问题是它没有做任何关于度符号的事情,它不能编码 – clifgray

0

你可以用正则表达式提取数据:

>>> 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

当您输入unicode字符串时,这似乎有一些问题。除此之外,我不认为这个想法是,将值作为字符串输出,而是得到一个元组,在那里你可以实际工作。 – Michael