[英]Bug in writing Excel data to Dictionary in Python with OpenPyXL
很抱歉用一堆深奥的代码打了你,但我遇到了一个不知道如何解决的错误。
基本上,我想读取电子表格列中的单个单元格并将其数据写入相应的字典(称为dataSet)。
我创建了一个函数来做到这一点:
def loopCol(col, start_offset, write_list):
'''
Loop through 1 column (col) until it ends. Skip header by start_offset.
Write data to list within DataSet dict
'''
from openpyxl.utils import column_index_from_string
# Create list and capture str of its name
list_string = str(write_list)
print(list_string)
if list_string not in dataSet:
raise KeyError('List name not within DataSet Keys')
write_list = []
# Loop through column, capturing each cell's value
# Use start_offset to skip header cells
for i in range(column_index_from_string(col) + start_offset,
sheet.max_row + 1):
listItem = sheet[col + str(i)].value
print(listItem)
if listItem != None:
if isinstance(listItem, datetime.datetime):
listItem = listItem.strftime('%d/%m/%Y')
write_list.append(listItem)
else:
write_list.append(listItem)
# Write data to dataSet
for list_index in write_list:
dataSet[list_string] = [list_index for list_index in write_list]
loopCol('A', 0, 'dates')
loopCol('B', 0, 'ph')
loopCol('C', 0, 'water_level')
loopCol('D', 0, 'salinity')
loopCol('E', 1, 'conductivity')
loopCol('F', 0, 'tds')
因此,从理论上讲,这应该遍历一列中的所有单元格,并且如果其中包含某些值,则将该值写入此字典中的相应位置:
dataSet = {
'dates': [],
'ph': [],
'water_level': [],
'salinity': [],
'conductivity': [],
'tds': []
}
但是,有一个问题。 说完所有的话,字典看起来像:
{'ph': [3.4, 2.1, 7], 'salinity': [2.2, 1.2], 'conductivity': [5.3], 'water_level': ['2m', '3m', '1m'], 'tds': [], 'dates': ['Date', '21/01/2016', '28/01/2012', '06/03/2012']}
现在,我知道每列中恰好有3个单元格具有值。 但是,有些人没有将其纳入字典。 “盐度”仅获得2个值,“电导率”仅获得1个值,“ tds”为空。 这些确实是dataSet dict中的最后一个条目,所以也许这就是原因的一部分。 但是我只是不知道逻辑中的错误在哪里。
有人可以帮忙吗? 我真的很想打动我的老板;)(我不在IT部门工作,所以任何使人们的生活更轻松的计算机向导都充满了惊奇和敬畏)。
如果我做得不够好,无法确切解释代码在做什么,请告诉我,我将尽力澄清。
您可以尝试这样的事情:
def colValues(sheet, keys, offsets=None):
if offsets is None or not len(offsets):
# Set offsets default to 0
offsets = {k: 0 for k in keys}
if len(offsets) != len(keys):
# If offsets given, fail if length mismatch
raise AttributeError()
res = {}
for column in sheet.columns:
# Store current column header field (i.e. its name)
ch = column[0].value
if ch not in keys:
# Fail early: No need for any tests if this column's data
# is not desired in result set.
continue
# Append all row values to the result dict with respect to the
# given column offset. Note: Lowest possible row index is 1,
# because here we assume that header fields are present.
res[ch] = [c.value for c in column[offsets[keys.index(ch)] + 1:]]
return res
if __name__ == '__main__':
xlsx = 'test.xlsx'
ws = load_workbook(xlsx)['Sheet1']
ds = colValues(ws, ['foo', 'bar'], [0, 1])
print(ds)
对于我的小型测试,这将产生每列正确的项目数。 注意,这里的键'bar'
少一个,因为在上面的函数调用中它的偏移量更大。
{u'foo': [2.3, 3.5, 5.6, 7.9], u'bar': [6.2, 3.6, 9L]}
此外,该代码更轻便。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.