如何在Python中打开Excel文件?


87

如何打开一个Excel文件以便在Python中读取?

例如,我已经sometextfile.txt使用read命令打开了文本文件。如何为Excel文件执行此操作?


2
哪个版本的Excel?如果您可以限制自己打开由Ecel 2007或2010创建的Excel文件,则应该能够将大部分或全部文件解析为XML。
亚当·克罗斯兰

Answers:


97

编辑:
在较新版本的熊猫中,您可以将工作表名称作为参数传递。

file_name =  # path to file + file name
sheet =  # sheet name or sheet number or list of sheet numbers and names

import pandas as pd
df = pd.read_excel(io=file_name, sheet_name=sheet)
print(df.head(5))  # print first 5 rows of the dataframe

检查文档以获取有关如何通过的示例sheet_namehttps :
//pandas.pydata.org/pandas-docs/stable/generation/pandas.read_excel.html

旧版本:
您也可以使用pandas...

当您使用具有多个工作表的excel文件时,可以使用:

import pandas as pd
xl = pd.ExcelFile(path + filename)
xl.sheet_names

>>> [u'Sheet1', u'Sheet2', u'Sheet3']

df = xl.parse("Sheet1")
df.head()

df.head() 将打印Excel文件的前5行

如果要使用一张工作表的Excel文件,则可以简单地使用:

import pandas as pd
df = pd.read_excel(path + filename)
print df.head()

2
这个解决方案使我感到欣慰。使用openpyxl时,我遇到了以下问题“ InvalidFileException:openpyxl不支持旧的.xls文件格式,请使用xlrd读取此文件,或将其转换为更新的.xlsx文件格式”。另一方面,大熊猫可以处理.xls和.xlsx文件……而且,读取整个表只需要一行代码。
nathanielng

3
您将需要安装可选的依赖项,xlrd以读取Excel文件和xlwt写入Excel文件。
Flimm

32

尝试xlrd库

[编辑] -从您的评论中我可以看到,下面的代码片段可能可以解决问题。我在这里假设您只是在一栏中搜索单词“ john”,但是您可以添加更多内容或将其添加到更通用的函数中。

from xlrd import open_workbook

book = open_workbook('simple.xls',on_demand=True)
for name in book.sheet_names():
    if name.endswith('2'):
        sheet = book.sheet_by_name(name)

        # Attempt to find a matching row (search the first column for 'john')
        rowIndex = -1
        for cell in sheet.col(0): # 
            if 'john' in cell.value:
                break

        # If we found the row, print it
        if row != -1:
            cells = sheet.row(row)
            for cell in cells:
                print cell.value

        book.unload_sheet(name) 

我认为这可能是我想要做的:从xlrd import open_workbook book = open_workbook('simple.xls',on_demand = True)作为book.sheet_names()中的名称:if name.endswith('2'):工作表= book.sheet_by_name(name)print sheet.cell_value(0,0)book.unload_sheet(name)large_files.py但我不希望它使用endwith我希望它查找并打印包含特定名称的行...我希望它打印包含john数据而不是bob数据的巨大Excel工作表的行。救命?
novak 2010年

我建议您将其作为一个单独的问题发布,并将代码放入代码块中。
乔恩·凯奇

这是一系列相关问题中的第二个问题。在第三个问题,据透露,真正的Excel文件据称是1.5 GB和电脑的内存被描述为“不够” ......看到 stackoverflow.com/questions/3241039/...
约翰·马金

16

这不像打开纯文本文件那样简单,并且将需要某种外部模块,因为没有内置模块可以执行此操作。以下是一些选项:

http://www.python-excel.org/

如果可能,您可能要考虑将excel电子表格导出为CSV文件,然后使用内置的python csv模块读取它:

http://docs.python.org/library/csv.html


好吧,我不太了解CSV内容,我如何让python将excel文件作为csv模块打开?我有一个程序可以为txt文件做我想做的事,并且我希望它对这个excel文件做同样的事情……这是最好的方法?您能详细说明一下吗?
novak 2010年

您可以使用xlrd之类的第三方python模块,也可以将excel文件保存为CSV文件,而不是普通的Excel文件。我认为您缺少的一点是,excel文件与纯文本文件没有相似之处。在记事本中打开Excel文档,您将明白我的意思。您要么需要将文件保存为纯文本格式(例如CSV(逗号分隔值)),而使用python则更容易阅读,或者安装并使用可以为您解析Excel文件的第3方模块。
唐纳德·麦纳

我遇到的问题是文件确实很大。如果无法完全打开文件,如何将文件另存为CSV格式?
诺瓦克

@novak:您的问题是文件大小为1.5GB,计算机的内存“不足” ...
John Machin 2010年

6

openpxyl包:

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']

>>> worksheet1 = wb2['Sheet1'] # one way to load a worksheet
>>> worksheet2 = wb2.get_sheet_by_name('Sheet2') # another way to load a worksheet
>>> print(worksheet1['D18'].value)
3
>>> for row in worksheet1.iter_rows():
>>>     print row[0].value()


1

这可能会有所帮助:

这将创建一个接受2D列表(列表项列表)的节点,并将其推入excel电子表格。确保IN []存在或将抛出异常。

这是对Excel 2013的Revit excel dynamo节点的重写,因为默认的预打包节点一直在中断。我也有一个类似的读取节点。Python中的excel语法很敏感。

thnx @CodingNinja-更新:)

###Export Excel - intended to replace malfunctioning excel node

import clr

clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
##AddReferenceGUID("{00020813-0000-0000-C000-000000000046}") ''Excel                            C:\Program Files\Microsoft Office\Office15\EXCEL.EXE 
##Need to Verify interop for version 2015 is 15 and node attachemnt for it.
from Microsoft.Office.Interop import  * ##Excel
################################Initialize FP and Sheet ID
##Same functionality as the excel node
strFileName = IN[0]             ##Filename
sheetName = IN[1]               ##Sheet
RowOffset= IN[2]                ##RowOffset
ColOffset= IN[3]                ##COL OFfset
Data=IN[4]                      ##Data
Overwrite=IN[5]                 ##Check for auto-overwtite
XLVisible = False   #IN[6]      ##XL Visible for operation or not?

RowOffset=0
if IN[2]>0:
    RowOffset=IN[2]             ##RowOffset

ColOffset=0
if IN[3]>0:
    ColOffset=IN[3]             ##COL OFfset

if IN[6]<>False:
    XLVisible = True #IN[6]     ##XL Visible for operation or not?

################################Initialize FP and Sheet ID
xlCellTypeLastCell = 11                 #####define special sells value constant
################################
xls = Excel.ApplicationClass()          ####Connect with application
xls.Visible = XLVisible                 ##VISIBLE YES/NO
xls.DisplayAlerts = False               ### ALerts

import os.path

if os.path.isfile(strFileName):
    wb = xls.Workbooks.Open(strFileName, False)     ####Open the file 
else:
    wb = xls.Workbooks.add#         ####Open the file 
    wb.SaveAs(strFileName)
wb.application.visible = XLVisible      ####Show Excel
try:
    ws = wb.Worksheets(sheetName)       ####Get the sheet in the WB base

except:
    ws = wb.sheets.add()                ####If it doesn't exist- add it. use () for object method
    ws.Name = sheetName



#################################
#lastRow for iterating rows
lastRow=ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
#lastCol for iterating columns
lastCol=ws.UsedRange.SpecialCells(xlCellTypeLastCell).Column
#######################################################################
out=[]                                  ###MESSAGE GATHERING

c=0
r=0
val=""
if Overwrite == False :                 ####Look ahead for non-empty cells to throw error
    for r, row in enumerate(Data):   ####BASE 0## EACH ROW OF DATA ENUMERATED in the 2D array #range( RowOffset, lastRow + RowOffset):
        for c, col in enumerate (row): ####BASE 0## Each colmn in each row is a cell with data ### in range(ColOffset, lastCol + ColOffset):
            if col.Value2 >"" :
                OUT= "ERROR- Cannot overwrite"
                raise ValueError("ERROR- Cannot overwrite")
##out.append(Data[0]) ##append mesage for error
############################################################################

for r, row in enumerate(Data):   ####BASE 0## EACH ROW OF DATA ENUMERATED in the 2D array #range( RowOffset, lastRow + RowOffset):
    for c, col in enumerate (row): ####BASE 0## Each colmn in each row is a cell with data ### in range(ColOffset, lastCol + ColOffset):
        ws.Cells[r+1+RowOffset,c+1+ColOffset].Value2 = col.__str__()

##run macro disbled for debugging excel macro
##xls.Application.Run("Align_data_and_Highlight_Issues")

@CodingNinja够了吗?:)
Apsis0215 '18

是的,要好得多

0

这段代码适用于Python 3.5.2。它打开并保存并表现出色。我目前正在研究如何将数据保存到文件中,但这是代码:

import csv
excel = csv.writer(open("file1.csv", "wb"))

 


-1
import pandas as pd 
import os 
files = os.listdir('path/to/files/directory/')
desiredFile = files[i]
filePath = 'path/to/files/directory/%s'
Ofile = filePath % desiredFile
xls_import = pd.read_csv(Ofile)

现在您可以使用pandas DataFrames的功能了!


1
问题是关于读取Excel文件,而不是逗号分隔的文本文件。熊猫似乎确实具有该功能(pandas.read_excel)。
巴特2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.