使用ijson进行解析,列表成为字符串 - 使它们成为嵌套的浮点数列表

时间:2017-10-23 08:07:57

标签: python json string list ijson

我有使用ijson解析的大型.GEOJSON文件。我加载的一个数据是列出的坐标,例如:“坐标”:[[[47335.8499999996,6571361.68],[47336.2599999998,6571360.54],[47336,6571335.4]]

我可以加载这些数据,将其类型从Decimal.decimal()更改为在ijson对象类中的float。我使用以下内容来解析JOSN文件。

class ReadJSON:    

def __init__(self, filename, name=""):
        self.name = name
        self.f = open(datafolder+filename)
        self.objects = ijson.items(self.f, 'features')

def load_file(self):
    for obj in self.objects:
        final_list = list()
        for entry in obj:
            temp_list = list()
            col_names = list()
            for key in entry.keys():
                for col in entry[key]:
                    temp_list.append(entry[key][col])
                    col_names.append(self.name+'.'+col)
                final_list.append(temp_list)
            df = pd.DataFrame(final_list, columns=col_names)
    return df

一切都应该到达应有的位置,但坐标列表是字符串类型。我需要能够处理各个点和xy坐标。我将举例如:df_rivers,其中df_rivers [“coordinates”]将包含此类列表。

我试过了

temp_list = "[[[47335.8499999996, 6571361.68], [47336.2599999998, 6571360.54], [47336, 6571335.4]]]"
t_list = temp_list.split('],')

print(temp_list[0])
out: [[[47335.8499999996, 6571361.68
type(temp_list[0]) is 'str'

point = temp_list[0].split(',')
print(point[0]):
[[[47335.8499999996
type(point[0]) is 'str

所以我能够访问每个点和坐标,但这非常麻烦。另外,point [1]突然变成了temp_list中间的界限。我有很多这些列表,实际上更长,我需要能够轻松地与它们一起工作。

我不关心修复是否在于加载数据,或者我是否可以在整个列上应用它,因为脚本很少会在完成后运行。但是,我将有153个文件,最多需要60000行,因此效率会很高。

我正在使用Python 3.6.3

1 个答案:

答案 0 :(得分:0)

您可以使用ast.literal_eval从字符串中获取列表对象:这是一个演示:

>>> temp_list = "[[[47335.8499999996, 6571361.68], [47336.2599999998, 6571360.54], [47336, 6571335.4]]]"
>>> import ast
>>> li = ast.literal_eval(temp_list)
>>> li
[[[47335.8499999996, 6571361.68], [47336.2599999998, 6571360.54], [47336, 6571335.4]]]
>>> type(li)
<class 'list'>

以下是Python文档:Doc