2012-10-02 209 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