使用Python(而非CSV文件)读取Excel(XLS)文件的最佳方法是什么。
是否有内置程序包在Python中默认支持执行此任务?
答案 0 :(得分:85)
我强烈建议您xlrd阅读.xls
个文件。
voyager提到了COM自动化的使用。几年前我自己这样做了,请注意这样做是真正的PITA。警告的数量巨大,文档缺乏和烦人。我遇到了许多奇怪的错误和陷阱,其中一些需要花费很多时间才能搞清楚。
更新:对于较新的.xlsx
文件,推荐的阅读和写作库似乎是openpyxl(谢谢,IkarPohorský)。
答案 1 :(得分:32)
使用pandas:
var obj = {
0: {
1:{a:1,b:2,c:3},
2:{c:1,b:2,a:3}
}
} ;
// to access :
alert(obj[0][1].b);
// Or
alert(obj[0][1]["b"]);
答案 2 :(得分:17)
python 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 :(得分:3)
我认为熊猫是最好的方式。 Pandas使用ExcelFile
函数已经有一个答案here,但它对我来说无法正常工作。从here开始,我找到了read_excel
函数,该函数运行正常:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
P.S。您需要为xlrd
功能安装read_excel
才能正常工作
答案 4 :(得分:1)
您可以使用任何库listed here(例如基于JExcelApi的Pyxlreader或xlwt),以及COM automation to use Excel itself来读取文件,但是为此,您将Office作为软件的依赖项,这可能并不总是一种选择。
答案 5 :(得分:1)
您也可以考虑运行(非python)程序xls2csv。给它一个xls文件,你应该回来一个csv。
答案 6 :(得分:0)
对于较旧的Excel文件,OleFileIO_PL module可以读取使用的OLE结构化存储格式。
答案 7 :(得分:0)
Python Excelerator也处理此任务。 http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
它也可以在Debian和Ubuntu中使用:
sudo apt-get install python-excelerator
答案 8 :(得分:0)
对于xlsx,我喜欢早于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'):
value = el.text
if el.tag.endswith('}c'):
if el.attrib.get('t') == 's':
value = strings[int(value)]
letter = el.attrib['r']
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
答案 9 :(得分:0)
如果您需要旧的XLS格式。下面的代码为ansii'cp1251'。
function updateSearchTopStoriesState = (hits, page) {
function updateState (prevState) {
...code
}
return updateState;
}
答案 10 :(得分:0)
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)
答案 11 :(得分:0)
对于较旧的.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.
答案 12 :(得分:0)
如果该文件确实是一个旧的.xls,则只需使用基本open()和pandas即可在python3上运行:
df = pandas.read_csv(open(f, encoding = 'UTF-8'), sep='\t')
请注意,我正在使用的文件是制表符分隔的。少一些,或者文本编辑器应该能够读取.xls,以便可以嗅出定界符。
由于–我认为– UTF-8问题,我对xlrd不太满意。
答案 13 :(得分:-1)
您可以访问 .xlsx 文件
import pandas as pd
df= pd.read_excel("file_path")