如何在python中动态更新命令(键/数据)
这是一个测试文件,我在其中尝试excel读取包,这就是为什么变量被惰性地命名。我试图从excel文件中读取数据并将其转换为JSON,但我在迭代数据并将其放入字典中时遇到问题如何在python中动态更新命令(键/数据),python,loops,dynamic,xlrd,Python,Loops,Dynamic,Xlrd,这是一个测试文件,我在其中尝试excel读取包,这就是为什么变量被惰性地命名。我试图从excel文件中读取数据并将其转换为JSON,但我在迭代数据并将其放入字典中时遇到问题 import xlrd from collections import OrderedDict import json # Open the workbook and select the first worksheet wb = xlrd.open_workbook('Test_Book.xlsx') sh = wb.
import xlrd
from collections import OrderedDict
import json
# Open the workbook and select the first worksheet
wb = xlrd.open_workbook('Test_Book.xlsx')
sh = wb.sheet_by_index(0)
data_list = []
data = OrderedDict()
for i in range(1, sh.nrows):
for j in range(1, sh.ncols+1):
data[sh.row_values(0)[i-1]] = sh.row_values(i)[j-1]
#data[j] = ({sh.row_values(0)[j-(sh.nrows - sh.ncols)] : sh.row_values(j)})
#print("I = "+i.__str__())
#print("J = "+j.__str__())
data_list.append(data)
# Serialize the list of dicts to JSON
j = json.dumps(data_list)
with open('data.json', 'w') as f:
f.write(j)
我尝试了嵌套for循环,但数据顺序不正确。
这些键似乎工作得很好,但当我尝试使用相同的数据时,它就不起作用了。
(这一次我不得不一行接一行地手动添加数据,第二部分是我尝试动态添加数据的地方)
下面是它需要的样子
OrderedDict([('ID', 2.0), ('Make', 'Toyota'), ('Model', 'Corolla'), ('Milage', 15956.0)])
OrderedDict([('ID', 3.0), ('Make', 'Jeep'), ('Model', 'Compass'), ('Milage', 114885.0)])
OrderedDict([('ID', 4.0), ('Make', 'Honda'), ('Model', 'Pilot'), ('Milage', 3830.0)])
下面是我的代码执行情况
OrderedDict([('ID', 5.0), ('Make', 'Subaru'), ('Model', 'Outback'), ('Milage', 20424.0), ('Condition', 'Fair')])
OrderedDict([('ID', 5.0), ('Make', 'Subaru'), ('Model', 'Outback'), ('Milage', 20424.0), ('Condition', 'Fair')])
OrderedDict([('ID', 5.0), ('Make', 'Subaru'), ('Model', 'Outback'), ('Milage', 20424.0), ('Condition', 'Fair')])
您只需在所有循环外部初始化
数据
OrderedDict
,而在内部,您似乎一直在反复更改相同键的值,这将一直更改相同的OrderedDict
对象,最后将相同的OrderedDict对象附加到数据列表中
您需要为每个迭代(外循环)创建一个新的数据OrderedDict
试试像这样的东西-
for i in range(1, sh.nrows):
data = OrderedDict()
for j in range(1, sh.ncols+1):
data[sh.row_values(0)[j-1]] = sh.row_values(i)[j-1]
data3.append(sh.row_values(i)[j-1])
#data[j] = ({sh.row_values(0)[j-(sh.nrows - sh.ncols)] : sh.row_values(j)})
#print("I = "+i.__str__())
#print("J = "+j.__str__())
data_list.append(data)
另外,您似乎没有对data3
执行任何操作,为什么它会出现?如果不需要,请将其删除。在python中,大多数变量都是引用,因此在存储它们时必须小心:
>>> list_of_lists = []
>>> l = [1, 2, 3] # Creating a random list
>>> list_of_lists.append(l) # Storing it
>>> l[1] = 'Blob' # Updating it! Here's the problem.
>>> list_of_lists.append(l) # Storing it again
>>> l = ['New', 'List'] # Creating a new list
>>> list_of_lists.append(l) # Storing it
>>> list_of_lists # Notice that the 2 first list are equals
[[1, 'Blob', 3], [1, 'Blob', 3], ['New', 'List']]
>>> list_of_lists[0] is list_of_lists[1]
True
在您的情况下,您只有一个数据对象,并且在数据列表中存储了对它的3个引用。通过重新初始化为空的OrderedDict
,您必须在每个循环中«重置»您的数据
变量,以获得预期结果:
for i in range(1, sh.nrows):
data = OrderedDict () # here
for j in range(1, sh.ncols+1):
data[sh.row_values(0)[j-1]] = sh.row_values(i)[j-1]
data3.append(sh.row_values(i)[j-1])
data_list.append(data)
另一种方法(IMO,不太pythonic)是在将数据
变量存储到数据列表
之前,显式创建该变量的副本:
for i in range(1, sh.nrows):
for j in range(1, sh.ncols+1):
data[sh.row_values(0)[j-1]] = sh.row_values(i)[j-1]
data3.append(sh.row_values(i)[j-1])
data_list.append(data.copy ())
数据
是一个引用,因此在最后您有一个列表,其中包含对同一OrderedDict
的3个引用。您需要在第一个语句之后重置数据
,以便执行data=orderedict()
orderedict([('ID','New')])orderedict([('Make','New')]))orderedict([('Model','Poor')])orderedict([('Milage','Good')])orderedict([(('Condition','Fair')])
这就是我得到的输出。很抱歉,我正在使用数据3来查看是否可以将其单独附加到字典数据中进行一个小的更改-data[sh.row_values(0)[j-1]=sh.row_values(i)[j-1]
,现在检查很高兴我能提供帮助:)OrderedDict([('ID','New')])OrderedDict([('Make','New')])OrderedDict([('Model','Poor'))OrderedDict(['Milage','Good'))OrderedDict([('Condition','Fair')])
这是我在初始化它时得到的输出。我想知道是否有一种方法可以让一个实例在动态向其中添加数据的同时遍历它。将数据分配给密钥不起作用。@user3570849您犯了一个小错误(i-1
而不是分配中的j-1
)。如果仍然不起作用,请向我们展示您的数据表。是的,我现在看到了。非常感谢你。