用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
。这个格式是可以调整的,也就是说它可能会变成 DSPCode,Arm_id,Pincode
。我把它保存在一个列表里,像这样:
FORMAT = ['Arm_id', 'DSPName', 'Pincode']
那么,给定这个可调整的 FORMAT
,我该如何读取特定列的内容呢?
这是我尝试过的。目前我能读取文件中的所有内容:
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
的内容,并获取 Arm_id
、DSPname
和 Pincode
在 values[0]
中的索引。接着在下一次循环中,我就知道了所有 FORMAT
因素的索引,从而知道我需要获取哪个值。
但这真的是个很糟糕的解决方案。
我该如何在Excel文件中获取特定列名的值呢?
8 个回答
12
关键的部分是获取表头(col_names = s.row(0)
),然后在遍历每一行的时候,要跳过第一行,因为那一行不需要(for row in range(1, s.nrows)
)。这里使用的是从1开始的范围(而不是默认的从0开始)。接着,你可以用zip来逐行处理,把'名字'作为这一列的表头。
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
101
虽然这个回答有点晚,但使用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]
确保你已经安装了xlrd和pandas这两个库:
pip install pandas xlrd
73
这是一种方法:
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