Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中动态更新命令(键/数据)_Python_Loops_Dynamic_Xlrd - Fatal编程技术网

如何在python中动态更新命令(键/数据)

如何在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.

这是一个测试文件,我在其中尝试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.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
)。如果仍然不起作用,请向我们展示您的数据表。是的,我现在看到了。非常感谢你。