用Python读取Excel文件
我有一个Excel文件
Arm_id DSPName DSPCode HubCode PinCode PPTL 1 JaVAS 01 AGR 282001 1,2 2 JaVAS 01 AGR 282002 3,4 3 JaVAS 01 AGR 282003 5,6
我想以Arm_id,DSPCode,Pincode
的forms保存一个string。 这种格式是可configuration的,即可能改变为DSPCode,Arm_id,Pincode
。 我把它保存在一个列表中
FORMAT = ['Arm_id', 'DSPName', 'Pincode']
如何使用提供的名称读取特定列的内容,因为FORMAT
是可configuration的。
这是我的尝试。 目前我能够读取文件中的所有内容
from xlrd import open_workbook wb = open_workbook('sample.xls') for s in wb.sheets(): #print 'Sheet:',s.name values = [] for row in range(s.nrows): col_value = [] for col in range(s.ncols): value = (s.cell(row,col).value) try : value = str(int(value)) except : pass col_value.append(value) values.append(col_value) print values
我的输出是
[[u'Arm_id', u'DSPName', u'DSPCode', u'HubCode', u'PinCode', u'PPTL'], ['1', u'JaVAS', '1', u'AGR', '282001', u'1,2'], ['2', u'JaVAS', '1', u'AGR', '282002', u'3,4'], ['3', u'JaVAS', '1', u'AGR', '282003', u'5,6']]
然后,我循环尝试查找values[0]
的FORMAT
内容,然后获取values[0]
的Arm_id, DSPname and Pincode
的索引values[0]
,然后从下一个循环中我知道所有FORMAT
的索引因素,从而知道我需要获得哪个价值。
但是这是一个糟糕的解决scheme。
如何在Excel文件中获取具有名称的特定列的值?
这是一个方法:
from xlrd import open_workbook class Arm(object): def __init__(self, id, dsp_name, dsp_code, hub_code, pin_code, pptl): self.id = id self.dsp_name = dsp_name self.dsp_code = dsp_code self.hub_code = hub_code self.pin_code = pin_code self.pptl = pptl def __str__(self): return("Arm object:\n" " Arm_id = {0}\n" " DSPName = {1}\n" " DSPCode = {2}\n" " HubCode = {3}\n" " PinCode = {4} \n" " PPTL = {5}" .format(self.id, self.dsp_name, self.dsp_code, self.hub_code, self.pin_code, self.pptl)) wb = open_workbook('sample.xls') for sheet in wb.sheets(): number_of_rows = sheet.nrows number_of_columns = sheet.ncols items = [] rows = [] for row in range(1, number_of_rows): values = [] for col in range(number_of_columns): value = (sheet.cell(row,col).value) try: value = str(int(value)) except ValueError: pass finally: values.append(value) item = Arm(*values) items.append(item) for item in items: print item print("Accessing one single value (eg. DSPName): {0}".format(item.dsp_name)) print
你不必使用自定义类,你可以简单地使用一个dict()
。 如果您使用的是类,则可以通过点符号访问所有值,如上所示。
这是上面脚本的输出:
Arm object: Arm_id = 1 DSPName = JaVAS DSPCode = 1 HubCode = AGR PinCode = 282001 PPTL = 1 Accessing one single value (eg. DSPName): JaVAS Arm object: Arm_id = 2 DSPName = JaVAS DSPCode = 1 HubCode = AGR PinCode = 282002 PPTL = 3 Accessing one single value (eg. DSPName): JaVAS Arm object: Arm_id = 3 DSPName = JaVAS DSPCode = 1 HubCode = AGR PinCode = 282003 PPTL = 5 Accessing one single value (eg. DSPName): JaVAS
有些迟到的答案,但有了pandas,可以直接得到一个excel文件的列:
import pandas df = pandas.read_excel('sample.xls') #print the column names print df.columns #get the values for a given column values = df['Arm_id'].values #get a data frame with selected columns FORMAT = ['Arm_id', 'DSPName', 'Pincode'] df_selected = df[FORMAT]
所以关键的部分是抓住头( col_names = s.row(0)
),当迭代通过行时,跳过第一行不需要for row in range(1, s.nrows)
– 完成使用从1开始的范围(不是隐含的0)。 然后使用zip来逐行通过“name”作为列的标题。
from xlrd import open_workbook wb = open_workbook('Book2.xls') values = [] for s in wb.sheets(): #print 'Sheet:',s.name for row in range(1, s.nrows): col_names = s.row(0) col_value = [] for name, col in zip(col_names, range(s.ncols)): value = (s.cell(row,col).value) try : value = str(int(value)) except : pass col_value.append((name.value, value)) values.append(col_value) print values
我采取的方法从第一行读取头信息以确定感兴趣列的索引。
你在问题中提到你也希望输出的值是一个string。 我dynamic地为FORMAT列列表的输出构build一个格式string。 行被附加到由新行char分隔的值string。
输出列顺序由FORMAT列表中列名的顺序决定。
在下面的代码中,FORMAT列表中的列名是重要的。 在上面的问题中,您已经在FORMAT列表中find了“Pincode”,但是在您的Excel中有“PinCode”。 这不会在下面工作,它将需要'PinCode'。
from xlrd import open_workbook wb = open_workbook('sample.xls') FORMAT = ['Arm_id', 'DSPName', 'PinCode'] values = "" for s in wb.sheets(): headerRow = s.row(0) columnIndex = [x for y in FORMAT for x in range(len(headerRow)) if y == firstRow[x].value] formatString = ("%s,"*len(columnIndex))[0:-1] + "\n" for row in range(1,s.nrows): currentRow = s.row(row) currentRowValues = [currentRow[x].value for x in columnIndex] values += formatString % tuple(currentRowValues) print values
对于您在上面输出的示例input:
>>> 1.0,JaVAS,282001.0 2.0,JaVAS,282002.0 3.0,JaVAS,282003.0
而因为我是一个pythonnoob,道具是: 这个答案 , 这个答案 , 这个问题 , 这个问题 和这个答案 。