在Python中读取Excel文件


88

我有一个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在内容上values[0],然后让指数Arm_id, DSPname and Pincodevalues[0],然后从下一个循环,我知道所有的指数FORMAT的因素,从而让知道哪些价值,我需要得到的。

但这是一个糟糕的解决方案。

如何获取Excel文件中具有名称的特定列的值?


您应该使用dict()或创建自己的数据类。
tamasgal 2014年

怎么样?您能否提供示例代码?
PythonEnthusiast 2014年

Answers:


70

这是一种方法:

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

90

答案有些晚了,但是对于熊猫来说,可以直接获取一个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

2
import xlrd在顶部添加以使此项工作。read_excel要求xlrd。如果得到了ImportError: No module named 'xlrd',那就去做pip install xlrd
nish17年

9
不需要导入xlrd,只需确保已安装xlrd,pandas将导入并使用它。
Vaibhav Vishal '18

12

因此,关键部分是抓住标头(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


2

这是读取excel文件并打印第1列中存在的所有单元格(第一个单元格即标头除外)的代码:

import xlrd

file_location="C:\pythonprog\xxx.xlsv"
workbook=xlrd.open_workbook(file_location)
sheet=workbook.sheet_by_index(0)
print(sheet.cell_value(0,0))

for row in range(1,sheet.nrows):
     print(sheet.cell_value(row,0))

1

我采用的方法从第一行中读取标题信息,以确定感兴趣的列的索引。

您在问题中提到您还希望将值输出到字符串。我为FORMAT列列表的输出动态构建了格式字符串。行被附加到由新行char分隔的values字符串。

输出列的顺序由FORMAT列表中列名的顺序确定。

在下面的代码中,FORMAT列表中列名的大小写很重要。在上面的问题中,您的FORMAT列表中包含“ 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

对于您在上面的代码输出中给出的示例输入:

>>> 1.0,JaVAS,282001.0
2.0,JaVAS,282002.0
3.0,JaVAS,282003.0

并且因为我是python noob,所以支持的是: 这个答案这个答案这个问题这个问题 和这个答案


我认为firstRow[x].value应该是headerRow[x].value
TSeymour

0

尽管我几乎总是只使用pandas来实现此功能,但是我目前使用的小工具却被打包到可执行文件中,并且将pandas包括在内是过大的。因此,我创建了poida解决方案的一个版本,该版本产生了一个命名元组列表。他的更改代码如下所示:

from xlrd import open_workbook
from collections import namedtuple
from pprint import pprint

wb = open_workbook('sample.xls')

FORMAT = ['Arm_id', 'DSPName', 'PinCode']
OneRow = namedtuple('OneRow', ' '.join(FORMAT))
all_rows = []

for s in wb.sheets():
    headerRow = s.row(0)
    columnIndex = [x for y in FORMAT for x in range(len(headerRow)) if y == headerRow[x].value]

    for row in range(1,s.nrows):
        currentRow = s.row(row)
        currentRowValues = [currentRow[x].value for x in columnIndex]
        all_rows.append(OneRow(*currentRowValues))

pprint(all_rows)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.