这是一个测试文件,我正在尝试excel读取包,这就是为什么变量被命名为lazily。我正在尝试从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')])
答案 0 :(得分:1)
你只是在所有循环之外初始化data
OrderedDict
,而在里面似乎你一次又一次地改变相同键的值,这会不断改变{{1对象,最后你将相同的OrderedDict对象追加到OrderedDict
。
您需要为每次迭代(外部循环)创建一个新的data_list
OrderedDict。
尝试类似 -
data
此外,您似乎没有对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)
做任何事情,为什么会这样?如果您不需要,请将其删除。
答案 1 :(得分:1)
在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
在您的情况下,您只有一个 data
对象,并在data_list
中存储了3个引用。您必须在每个循环中“重置”data
变量,方法是重新初始化为空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)
另一种方式(较少pythonic,IMO)是明确创建data
变量的副本,然后将其存储到data_list
中:
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 ())