使用 ijson 解析,列表变成字符串 - 使它们成为嵌套的浮点数列表
Parsing with ijson, lists become strings - make them nested lists of floats
我有很大的 .GEOJSON 文件,我使用 ijson 进行解析。我加载的一个数据是列出的坐标,例如:[[[47335.8499999996, 6571361.68], [47336.2599999998, 6571360.54], [47336, 6571335.4]]]
我能够加载此数据,将其类型从 Decimal.decimal() 更改为在 ijson 对象 class 中浮动。我使用以下内容来解析 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]在atemp_list的中间突然变成了界外。我有很多这样的列表,实际上它们要长得多,我需要能够轻松地使用它们。
我不在乎修复是否在于数据加载,或者我是否可以在之后将其应用到整个专栏,因为脚本完成后很少 运行。但是,我将有 153 个文件,最多 60000 行,它必须 运行 通过,所以效率会很好。
我正在使用 Python 3.6.3
您可以使用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
我有很大的 .GEOJSON 文件,我使用 ijson 进行解析。我加载的一个数据是列出的坐标,例如:[[[47335.8499999996, 6571361.68], [47336.2599999998, 6571360.54], [47336, 6571335.4]]]
我能够加载此数据,将其类型从 Decimal.decimal() 更改为在 ijson 对象 class 中浮动。我使用以下内容来解析 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]在atemp_list的中间突然变成了界外。我有很多这样的列表,实际上它们要长得多,我需要能够轻松地使用它们。
我不在乎修复是否在于数据加载,或者我是否可以在之后将其应用到整个专栏,因为脚本完成后很少 运行。但是,我将有 153 个文件,最多 60000 行,它必须 运行 通过,所以效率会很好。
我正在使用 Python 3.6.3
您可以使用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