使用Python读取/解析Excel(xls)文件

qrb*_*baQ 107 python xls

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

是否有一个内置包,默认情况下在Python中支持执行此任务?

tal*_*nat 90

我强烈推荐使用xlrd来读取.xls文件.

旅行者提到了COM自动化的使用.几年前我自己这样做了,请注意这样做是真正的PITA.警告的数量巨大,文档缺乏和烦人.我遇到了许多奇怪的错误和陷阱,其中一些需要花费很多时间来弄明白.

更新:对于较新的.xlsx文件,推荐的读写库似乎是openpyxl.

  • 对于Excel 2007+文件(`.xlsx`),您可能会使用[OpenPyXL](http://openpyxl.readthedocs.org/). (4认同)

小智 42

使用熊猫:

import pandas as pd

xls = pd.ExcelFile("yourfilename.xls")

sheetX = xls.parse(2) #2 is the sheet number

var1 = sheetX['ColumnName']

print(var1[1]) #1 is the row number...
Run Code Online (Sandbox Code Playgroud)

  • pandas 使用 xlrd 进行读取;您还需要安装 xlrd 作为依赖项 (2认同)

Som*_*mil 23

python xlrd库可以更好地解决这个问题

pip install xlrd
Run Code Online (Sandbox Code Playgroud)

打开工作簿

import xlrd
Run Code Online (Sandbox Code Playgroud)

按名称打开表格

workbook = xlrd.open_workbook('your_file_name.xlsx')
Run Code Online (Sandbox Code Playgroud)

按索引打开表格

worksheet = workbook.sheet_by_name('Name of the Sheet')
Run Code Online (Sandbox Code Playgroud)

读取单元格值

worksheet = workbook.sheet_by_index(0)
Run Code Online (Sandbox Code Playgroud)


Foa*_*oad 8

我认为熊猫是最好的选择。关于使用函数的Pandas ,这里已经有了一个答案ExcelFile,但是它对我来说无法正常工作。从这里我发现了可以read_excel正常工作的函数:

import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
Run Code Online (Sandbox Code Playgroud)

PS您需要xlrd安装才能read_excel正常工作


Han*_*der 7

对于 xlsx,我喜欢之前发布的解决方案https://web.archive.org/web/20180216070531//sf/ask/305981441/。我只使用标准库中的模块。

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
Run Code Online (Sandbox Code Playgroud)

添加的改进包括按工作表名称获取内容、使用 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
Run Code Online (Sandbox Code Playgroud)


Est*_*ber 1

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

  • (1)pyxlreader是绝对的痘。你一定没有尝试过。请参阅我的评论:http://stackoverflow.com/questions/1243545/programmatically-extract-data-from-an-excel-spreadsheet (2) `xlwt` WriTes 文件;使用“xlrd”读取文件。 (7认同)