使用 python 和数据库在列表中列出
List inside a List using python and Database
我希望创建一个类似 --
的文档
{
"name" : "John" ,
"DOB" : "21-Jun-1999" ,
"Sex" : "M" ,
"Skill" : ["C","PYTHON","COBOL"],
"Location" : { "lat":12.3 , "Long" : "14.6" }
}
我正在使用 cx_oracle
从我的数据库中提取数据。
这是我的代码的一小部分 --
cur1.execute('select name,dob,sex,skills,long,lat from employee');
# to create the keys
for i in range(len(cur1.description)):
head=cur1.description[i][0]
header = header + [head]
for row in cur1.fetchall():
data_dict={}
for i in range(len(row)):
if i == 3 :
c={}
c=row[i]
c=c.split(',')
for j in range(len(c)):
data_dict.setdefault(header[i],[]).append(c[j])
else:
data_dict.setdefault(header[i],[]).append(row[i])
print(data_dict)
这是输出--
{
"name" : "John" ,
"DOB" : "21-Jun-1999" ,
"Sex" : "M" ,
"Skill" : ["C","PYTHON","COBOL"]
}
如何从我的 SQL(long 和 lat)转换最后两个字段并创建另一个列表。
我没有安装 cx_oracle,所以没有测试但是...
从您想要的输出来看,您似乎希望 Location
字段的值是字典,而不是列表。鉴于此,并假设 row
的索引 4 和 5 将始终分别代表您的 lat
和 long
列,您可以执行以下操作:
data_dict['Location'] = {'lat': row[4], 'long': row[5]}
您的示例输出显示您希望经度为字符串,纬度为整数。我假设这是一个打字错误,但如果不是,您可以通过对 lat
和 long
分别使用 int(row[4])
和 str(row[5])
来确保这些值。此外,如果您更喜欢使用列名作为 Location
字典的键,您可以分别将 lat
和 long
替换为 header[4]
和 header[5]
.
您还必须更改循环以确保您不会在 data_dict
中为 lat
和 long
添加其他字段。并确保你用 data_dict
做一些事情,这样它就不会在每次循环迭代后都被破坏:
对于 Python2.7 及更高版本:
records = []
for row in cur1.fetchall():
data_dict = {header[i]: row[i] for i in range(len(row)) if i < 3}
data_dict[header[3]] = row[3].split(',')
data_dict[‘Location’] = {header[4]: row[4], header[5]: row[5]}
records.append(data_dict)
Python2.6 及之前:
records = []
for row in cur1.fetchall():
data_dict = {
header[3]: row[3].split(',')
'Location': {header[4]: row[4], header[5]: row[5]}
}
for i in range(len(row)):
if i < 3 :
data_dict[header[i]] = row[i]
records.append(data_dict)
就其价值而言,我相信 cur1
是一个迭代器,您可以简单地执行 for row in cur1
。当有很多行时,这将有助于减少内存使用量。
我希望创建一个类似 --
的文档{
"name" : "John" ,
"DOB" : "21-Jun-1999" ,
"Sex" : "M" ,
"Skill" : ["C","PYTHON","COBOL"],
"Location" : { "lat":12.3 , "Long" : "14.6" }
}
我正在使用 cx_oracle
从我的数据库中提取数据。
这是我的代码的一小部分 --
cur1.execute('select name,dob,sex,skills,long,lat from employee');
# to create the keys
for i in range(len(cur1.description)):
head=cur1.description[i][0]
header = header + [head]
for row in cur1.fetchall():
data_dict={}
for i in range(len(row)):
if i == 3 :
c={}
c=row[i]
c=c.split(',')
for j in range(len(c)):
data_dict.setdefault(header[i],[]).append(c[j])
else:
data_dict.setdefault(header[i],[]).append(row[i])
print(data_dict)
这是输出--
{
"name" : "John" ,
"DOB" : "21-Jun-1999" ,
"Sex" : "M" ,
"Skill" : ["C","PYTHON","COBOL"]
}
如何从我的 SQL(long 和 lat)转换最后两个字段并创建另一个列表。
我没有安装 cx_oracle,所以没有测试但是...
从您想要的输出来看,您似乎希望 Location
字段的值是字典,而不是列表。鉴于此,并假设 row
的索引 4 和 5 将始终分别代表您的 lat
和 long
列,您可以执行以下操作:
data_dict['Location'] = {'lat': row[4], 'long': row[5]}
您的示例输出显示您希望经度为字符串,纬度为整数。我假设这是一个打字错误,但如果不是,您可以通过对 lat
和 long
分别使用 int(row[4])
和 str(row[5])
来确保这些值。此外,如果您更喜欢使用列名作为 Location
字典的键,您可以分别将 lat
和 long
替换为 header[4]
和 header[5]
.
您还必须更改循环以确保您不会在 data_dict
中为 lat
和 long
添加其他字段。并确保你用 data_dict
做一些事情,这样它就不会在每次循环迭代后都被破坏:
对于 Python2.7 及更高版本:
records = []
for row in cur1.fetchall():
data_dict = {header[i]: row[i] for i in range(len(row)) if i < 3}
data_dict[header[3]] = row[3].split(',')
data_dict[‘Location’] = {header[4]: row[4], header[5]: row[5]}
records.append(data_dict)
Python2.6 及之前:
records = []
for row in cur1.fetchall():
data_dict = {
header[3]: row[3].split(',')
'Location': {header[4]: row[4], header[5]: row[5]}
}
for i in range(len(row)):
if i < 3 :
data_dict[header[i]] = row[i]
records.append(data_dict)
就其价值而言,我相信 cur1
是一个迭代器,您可以简单地执行 for row in cur1
。当有很多行时,这将有助于减少内存使用量。