0

PythonでJSONドキュメントを解析していますが、GPS文字列を正しい形式に変換するのに問題があることを除いて、ほぼすべてのプロセスが機能するようになりました。

私は次のフォームを持っています:

"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を上記のような形にする方法がわかりません。

4

4 に答える 4

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

ちなみに、これらはintではありません...

于 2012-10-02T04:28:07.983 に答える
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(';'))

たまに派手な、なぜ派手な正規表現を避けるのですか;)

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
于 2012-10-02T04:38:47.340 に答える
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]
于 2012-10-02T04:45:41.637 に答える
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)")
于 2012-10-02T05:20:08.093 に答える