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

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

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

340044 次浏览

您可以使用任何库 列在这里(如基于 JExcelApi 或 谢谢读写器) ,再加上 COM 自动化使用 Excel 本身来读取文件,但是为此,您将 Office 作为软件的一个依赖项引入,这可能并不总是一个选项。

您还可以考虑运行(非 python)程序 xls2csv。给它一个 xls 文件,你应该得到一个 csv。

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

PythonExcelerator 也可以处理这个任务

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

 sudo apt-get install python-excelerator

你可以选择其中任何一个 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

你可以用熊猫来做到这一点,首先安装所需的库:

$ 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...

我觉得熊猫是最好的选择。已经有一个答案 给你与熊猫使用 ExcelFile的功能,但它不适合我的工作。从 给你我发现 read_excel功能工作得很好:

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

你需要安装 xlrd来实现 read_excel功能

更新21-03-2020: 正如你可能看到的 给你xlrd引擎有一些问题,它将被弃用。openpyxl是最好的替代品。因此,正如 给你所描述的,规范语法应该是:

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

对于 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

如果你需要旧的 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))
    with open(csv_filename) as file:
data = file.read()


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

您可以使用内置软件包将 CSV 转换为如上所示的 Excel。CSV 可以通过一个内置的 dictreader 和 dictwitter 包来处理,它的工作方式与 python dictionary 相同。所以很简单 我目前不知道任何内置的 Excel 包,但我遇到了 openpyxl。它也非常直接和简单,您可以看到下面的代码片段,希望这有所帮助

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

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

你可以直接导入 xlrd来使用它

import xlrd
wb = xlrd.open_workbook(file_name)

或者你也可以使用熊猫 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.

如果这个文件真的是一个旧的. xls 文件,那么在 python3上使用 base open ()和 Pandas 就可以了:

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

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

由于-我认为-UTF-8的问题,我在 xlrd 上运气不太好。