使用 Python 读取/解析 Excel (xls) 文件[关闭]

2025-02-28 08:22:00
admin
原创
76
摘要:问题描述:使用 Python 读取 Excel(XLS)文件(而不是CSV文件)的最佳方法是什么。Python 中是否有默认支持的内置包来执行此任务?解决方案 1:我强烈推荐使用xlrd来读取.xls文件。但它有一些限制(参考xlrd github 页面):警告此库将不再读取 .xls 文件以外的任何文件。有...

问题描述:

使用 Python 读取 Excel(XLS)文件(而不是CSV文件)的最佳方法是什么。

Python 中是否有默认支持的内置包来执行此任务?


解决方案 1:

我强烈推荐使用xlrd来读取.xls文件。但它有一些限制(参考xlrd github 页面):

警告

此库将不再读取 .xls 文件以外的任何文件。有关读取较新文件格式的替代方案,请参阅
http://www.python-excel.org/

下列内容也不受支持,但可以安全可靠地被忽略:

- Charts, Macros, Pictures, any other embedded object, including embedded worksheets.
- VBA modules
- Formulas, but results of formula calculations are extracted.
- Comments
- Hyperlinks
- Autofilters, advanced filters, pivot tables, conditional formatting, data validation

该库不支持受密码保护的文件,因此无法读取这些文件。

voyager 提到了 COM 自动化的使用。几年前我自己也做过这件事,但请注意,这样做真的很麻烦。警告数量巨大,文档缺乏且令人厌烦。我遇到了许多奇怪的错误和陷阱,其中一些花了好几个小时才弄清楚。

更新:

对于较新的.xlsx文件,推荐的读写库似乎是openpyxl(感谢 Ikar Pohorský)。

解决方案 2:

您可以使用 pandas 来执行此操作,首先安装所需的库:

$ pip install pandas openpyxl

参见下面的代码:

import pandas as pd

xls = pd.ExcelFile(r"yourfilename.xls") # use r before absolute file path 

sheetX = xls.parse(2) #2 is the sheet number+1 thus if the file has only 1 sheet write 0 in paranthesis

var1 = sheetX['ColumnName']

print(var1[1]) #1 is the row number...

解决方案 3:

您可以选择其中任何一个http://www.python-excel.org/

我推荐python xlrd库。

使用安装

pip install xlrd

导入使用

import xlrd

打开工作簿

workbook = xlrd.open_workbook('your_file_name.xlsx')

按名称打开工作表

worksheet = workbook.sheet_by_name('Name of the Sheet')

按索引打开工作表

worksheet = workbook.sheet_by_index(0)

读取单元格值

worksheet.cell(0, 0).value    

解决方案 4:

我认为 Pandas 是最好的选择。这里已经有一个使用 PandasExcelFile函数的答案,但对我来说效果不佳。从这里我找到了read_excel可以正常工作的函数:

import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))

PS您需要安装xlrd才能read_excel使用此功能

2020 年 3 月 21 日更新:正如您在此处看到的,该引擎存在问题xlrd,将被弃用。openpyxl是最好的替代品。因此,正如此处所述,规范语法应该是:

dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")

更新 03-03-2023:现在还有其他几个可用选项。例如用 Rust 编写的 Polars 库:

import polars as pl
dfs = pl.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")

还可以随意检查 PyArrow 和 pyodbc 库。

解决方案 5:

对于 xlsx,我喜欢之前发布的解决方案,即https://web.archive.org/web/20180216070531/https://stackoverflow.com/questions/4371163/reading-xlsx-files-using-python。我只使用标准库中的模块。

def xlsx(fname):
    import zipfile
    from xml.etree.ElementTree import iterparse
    z = zipfile.ZipFile(fname)
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
    rows = []
    row = {}
    value = ''
    for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):
        if el.tag.endswith('}v'):  # Example: <v>84</v>                            
            value = el.text
        if el.tag.endswith('}c'):  # Example: <c r="A3" t="s"><v>84</v></c>                                 
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r']  # Example: AZ22                         
            while letter[-1].isdigit():
                letter = letter[:-1]
            row[letter] = value
            value = ''
        if el.tag.endswith('}row'):
            rows.append(row)
            row = {}
    return rows

增加的改进是通过工作表名称获取内容,使用 re 获取列并检查是否使用了共享字符串。

def xlsx(fname,sheet):
    import zipfile
    from xml.etree.ElementTree import iterparse
    import re
    z = zipfile.ZipFile(fname)
    if 'xl/sharedStrings.xml' in z.namelist():
        # Get shared strings
        strings = [element.text for event, element
                   in iterparse(z.open('xl/sharedStrings.xml')) 
                   if element.tag.endswith('}t')]
    sheetdict = { element.attrib['name']:element.attrib['sheetId'] for event,element in iterparse(z.open('xl/workbook.xml'))
                                      if element.tag.endswith('}sheet') }
    rows = []
    row = {}
    value = ''

    if sheet in sheets:
    sheetfile = 'xl/worksheets/sheet'+sheets[sheet]+'.xml'
    #print(sheet,sheetfile)
    for event, element in iterparse(z.open(sheetfile)):
        # get value or index to shared strings
        if element.tag.endswith('}v') or element.tag.endswith('}t'):
            value = element.text
        # If value is a shared string, use value as an index
        if element.tag.endswith('}c'):
            if element.attrib.get('t') == 's':
                value = strings[int(value)]
            # split the row/col information so that the row leter(s) can be separate
            letter = re.sub('d','',element.attrib['r'])
            row[letter] = value
            value = ''
        if element.tag.endswith('}row'):
            rows.append(row)
            row = {}

    return rows

解决方案 6:

如果您需要旧的 XLS 格式。以下是 ansii 'cp1251' 的代码。

import xlrd

file=u'C:/Landau/task/6200.xlsx'

try:
    book = xlrd.open_workbook(file,encoding_override="cp1251")  
except:
    book = xlrd.open_workbook(file)
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
   print(sh.row(rx))

解决方案 7:

    with open(csv_filename) as file:
        data = file.read()

    with open(xl_file_name, 'w') as file:
        file.write(data)

您可以使用内置包将 CSV 转换为 Excel,如上所示。CSV 可以使用内置包 dictreader 和 dictwriter 来处理,其工作方式与 Python 字典的工作方式相同。这让事情变得非常简单。我目前不知道任何内置的 Excel 包,但我遇到了 openpyxl。它也非常直接和简单。您可以看到下面的代码片段,希望这对您有所帮助

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)

解决方案 8:

对于较旧的.xls文件,您可以使用xlrd

你也可以xlrd直接通过导入来使用。如下所示

import xlrd
wb = xlrd.open_workbook(file_name)

或者也可以使用pandas的pd.read_excel()方法,但是不要忘记指定引擎,虽然默认是xlrd,但还是必须指定。

pd.read_excel(file_name, engine = xlrd)

它们都适用于较旧的.xls文件格式。事实上,我在使用时遇到了这个问题OpenPyXL,我得到了以下错误

InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.

解决方案 9:

您可以使用此处列出的任何库(例如基于 JExcelApi 的Pyxlreader或xlwt),加上COM 自动化来使用 Excel 本身读取文件,但为此您需要引入 Office 作为软件的依赖项,这可能并不总是一种选择。

解决方案 10:

您也可以考虑运行(非 Python)程序 xls2csv。输入一个 xls 文件,您应该会得到一个 csv。

解决方案 11:

Python Excelerator 也可以处理这个任务。http ://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/

它也可以在 Debian 和 Ubuntu 中使用:

 sudo apt-get install python-excelerator

解决方案 12:

如果该文件确实是一个旧的 .xls,那么在 python3 上只需使用基本 open() 和 pandas 就可以为我工作:

df = pandas.read_csv(open(f, encoding = 'UTF-8'), sep='    ')

请注意,我使用的文件是制表符分隔的。less 或文本编辑器应该能够读取 .xls,以便您可以嗅出分隔符。

我在使用 xlrd 时运气不佳,我认为是因为 UTF-8 问题。

解决方案 13:

对于较旧的 Excel 文件,有OleFileIO_PL 模块可以读取所使用的 OLE 结构化存储格式。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用