使用xlrd读取excel并存储数据

时间:2016-08-03 10:32:55

标签: python xlrd

我在excel表中有这个数据

FT_NAME     FC_NAME C_NAME
FT_NAME1    FC1     C1
FT_NAME2    FC21    C21
            FC22    C22
FT_NAME3    FC31    C31
            FC32    C32
FT_NAME4    FC4     C4

其中列名为

  

FT_NAME,FC_NAME,C_NAME

我希望将这些值存储在数据结构中以供进一步使用,目前我正在尝试将它们存储在列表列表中但不能使用以下代码

i=4
    oc=sheet.cell(i,8).value  
    fcl,ocl=[],[]
    while oc:
        ft=sheet.cell(i,6).value
        fc=sheet.cell(i,7).value
        oc=sheet.cell(i,8).value 

        if ft:
            self.foreign_tables.append(ft)
            fcl.append(fc)
            ocl.append(oc)
            self.foreign_col.append(fcl)
            self.own_col.append(ocl)
            fcl,ocl=[],[]

        else:
            fcl.append(fc)
            ocl.append(oc)    

        i+=1

我希望输出为

ft=[FT_NAME1,FT_NAME2,FT_NAME3,FT_NAME4]
fc=[FC1, [FC21,FC22],[FC31,FC32],FC4]
oc=[C1,[C21,C22],[C31,C32],C4]

有谁可以请求帮助更好的pythonic解决方案?

1 个答案:

答案 0 :(得分:0)

您可以使用pandas。它将数据读入DataFrame,这本质上是一个大字典。

import pandas as pd

data =pd.read_excel('file.xlsx', 'Sheet1')
data = data.fillna(method='pad')

print(data)

它提供以下输出:

    FT_NAME FC_NAME C_NAME
0  FT_NAME1     FC1     C1
1  FT_NAME2    FC21    C21
2  FT_NAME2    FC22    C22
3  FT_NAME3    FC31    C31
4  FT_NAME3    FC32    C32
5  FT_NAME4     FC4     C4

要获取子列表结构,请尝试使用此函数:

def group(data):
    output = []
    names = list(set(data['FT_NAME'].values))
    names.sort()
    output.append(names)
    headernames = list(data.columns)
    headernames.pop(0)

    for ci in list(headernames):
        column_group = []
        column_data = data[ci].values
        for name in names:
            column_group.append(list(column_data[data['FT_NAME'].values == name]))
        output.append(column_group)

    return output

如果你这样称呼它:

ft, fc, oc = group(data)
print(ft)
print(fc)
print(oc)

你得到以下输出:

['FT_NAME1', 'FT_NAME2', 'FT_NAME3', 'FT_NAME4']
[['FC1'], ['FC21', 'FC22'], ['FC31', 'FC32'], ['FC4']]
[['C1'], ['C21', 'C22'], ['C31', 'C32'], ['C4']]

这是你想要的,除了现在也在列表中的单个元素。

这不是最干净的方法,但它可以完成工作。

希望它有所帮助。