问题:使用Python读取/解析Excel(xls)文件
用Python读取Excel(XLS)文件(而不是CSV文件)的最佳方法是什么。
有默认情况下Python支持的内置程序包吗?
回答 0
我强烈建议使用xlrd读取.xls
文件。
voyager提到了COM自动化的使用。几年前自己做过此事,请注意做这是真正的PITA。需要警告的数量巨大,并且缺少文档并且令人讨厌。我遇到了许多奇怪的错误和陷阱,其中一些花费了许多小时才能弄清楚。
更新:对于较新的.xlsx
文件,推荐用于读写的库似乎是openpyxl(感谢IkarPohorský)。
回答 1
使用熊猫:
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...
回答 2
您可以选择其中任意一个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
回答 3
我认为熊猫是最好的选择。已经有一个答案在这里使用与熊猫ExcelFile
的功能,但它并没有为我正常工作。从这里我发现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
正常工作
更新21-03-2020:正如您可能在此处看到的那样,xlrd
引擎存在问题,它将不推荐使用。该openpyxl
是最好的替代品。因此,作为描述在这里,规范的语法应为:
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
回答 4
对于xlsx,我喜欢先前发布的解决方案https://web.archive.org/web/20180216070531//programming/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
回答 5
你可以使用任何的库列在这里(如Pyxlreader是基于JExcelApi的,或xlwt),加上COM自动化使用Excel本身的文件的阅读,但是对于您将引入厅认定为软件的依赖,这可能并不总是一个选择。
回答 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
Python Excelerator也可以处理此任务。 http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
它在Debian和Ubuntu中也可用:
sudo apt-get install python-excelerator
回答 8
您可能还考虑运行(非python)程序xls2csv。将其输入xls文件,然后应返回一个csv。
回答 9
对于较早的Excel文件,有一个OleFileIO_PL模块可以读取所使用的OLE结构化存储格式。
回答 10
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)