使用 Python 读取 Excel 文件,如何获取具有指定列名的特定列的值?

Posted

技术标签:

【中文标题】使用 Python 读取 Excel 文件,如何获取具有指定列名的特定列的值?【英文标题】:Reading Excel File using Python, how do I get the values of a specific column with indicated column name? 【发布时间】:2014-04-05 19:59:25 【问题描述】:

我有一个 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] 试图找出values[0] 中的FORMAT 内容,然后在values[0] 中获取Arm_id, DSPname and Pincode 的索引,然后从下一个循环中我知道所有@ 的索引987654334@ 因子,从而知道我需要得到哪个值。

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

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

【问题讨论】:

您应该使用dict() 或创建自己的数据类。 怎么样?你能提供一个示例代码吗? 请参阅***.com/a/2943487/4366445,“对于 Excel 2007+ 文件 (.xlsx),您可能会使用 OpenPyXL”,这里所有推荐 xlrd 的高票答案似乎只关注 Excel 2007 和早期版本的文件 (.xls)。我不确定问题描述是否应该修改得更清楚。 【参考方案1】:

一个有点晚的答案,但使用 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

【讨论】:

在顶部添加 import xlrd 以完成这项工作。 read_excel 需要 xlrd。如果得到ImportError: No module named 'xlrd',则执行pip install xlrd 不需要导入xlrd,只要确保xlrd已经安装,pandas会导入并使用。【参考方案2】:

这是一种方法:

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

【讨论】:

【参考方案3】:

所以关键部分是抓住标题(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

【讨论】:

【参考方案4】:

通过使用 pandas,我们可以轻松读取 excel。

import pandas as pd 
from pandas import ExcelWriter
from pandas import ExcelFile 

DataF=pd.read_excel("Test.xlsx",sheet_name='Sheet1')

print("Column headings:")
print(DataF.columns)

测试:https://repl.it 参考:https://pythonspot.com/read-excel-with-pandas/

【讨论】:

你为什么要导入xlrd【参考方案5】:

这是读取 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))

【讨论】:

【参考方案6】:

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

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

输出列顺序由 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 菜鸟,所以道具是: this answer, this answer, this question, this question and this answer.

【讨论】:

我认为firstRow[x].value 应该是headerRow[x].value【参考方案7】:

我使用 openpyxl 库阅读过,

import openpyxl
from pathlib import Path

xlsx_file = Path('C:\\Users\\Amit\\Desktop\\ReadExcel', 'ReadData.xlsx')
wb_obj = openpyxl.load_workbook(xlsx_file) 

# Read the active sheet:
sheet = wb_obj.active

for i in range(sheet.max_column):
    print(f'i = i')
    for row in sheet.iter_rows():
        print(row[i].value)

【讨论】:

【参考方案8】:

虽然我几乎总是只使用 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)

【讨论】:

以上是关于使用 Python 读取 Excel 文件,如何获取具有指定列名的特定列的值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 读取 Excel 文件,如何获取具有指定列名的特定列的值?

如何使用 Python 读取包含扩展字体的 Excel 文件? (openpyxl 错误:最大值为 14)

如何读取csv文件和excel文件python? [关闭]

Python应用实战-如何通过python对Excel进行常规性操作

如何使用 PowerShell 或 python 脚本读取、编辑或附加存储在 Azure Blob 存储中的 Excel 文件(列和行)

python读取和生成excel文件