Como posso abrir um arquivo Excel em Python?

87

Como abro um arquivo que é um arquivo do Excel para leitura em Python?

Abri arquivos de texto, por exemplo, sometextfile.txtcom o comando de leitura. Como faço isso para um arquivo Excel?

novak
fonte
2
Qual versão do Excel? Se você puder se limitar a abrir arquivos do Excel criados pelo Ecel 2007 ou 2010, deverá ser capaz de analisar a maior parte ou a totalidade do arquivo como XML.
Adam Crossland

Respostas:

97

Editar:
na versão mais recente do pandas, você pode passar o nome da folha como parâmetro.

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

Verifique os documentos para obter exemplos de como passar sheet_name:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html

Versão antiga:
você também pode usar o pandaspacote ....

Ao trabalhar com um arquivo Excel com várias planilhas, você pode usar:

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() irá imprimir as primeiras 5 linhas do seu arquivo Excel

Se você estiver trabalhando com um arquivo Excel com uma única planilha, pode simplesmente usar:

import pandas as pd
df = pd.read_excel(path + filename)
print df.head()
Rakesh Adhikesavan
fonte
2
esta solução obtém meu upvote. com openpyxl, estou tendo o seguinte problema "InvalidFileException: openpyxl não oferece suporte ao formato de arquivo .xls antigo, use xlrd para ler este arquivo ou converta-o para o formato de arquivo .xlsx mais recente". Por outro lado, o pandas lida com arquivos .xls e .xlsx ... além disso, ler uma tabela inteira requer apenas uma linha de código.
nathanielng de
3
Você precisará instalar dependências opcionais xlrdpara ler arquivos do Excel e xlwtpara gravar arquivos do Excel.
Flimm 01 de
32

Experimente a biblioteca xlrd .

[Editar] - pelo que posso ver em seu comentário, algo como o snippet abaixo pode resolver o problema. Estou supondo que você está apenas pesquisando em uma coluna a palavra 'john', mas você pode adicionar mais ou tornar isso uma função mais genérica.

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) 
Jon Cage
fonte
Eu acho que pode ser isso que eu quero fazer: from xlrd import open_workbook book = open_workbook ('simple.xls', on_demand = True) para nome em book.sheet_names (): if name.endswith ('2'): sheet = book.sheet_by_name (name) print sheet.cell_value (0,0) book.unload_sheet (name) large_files.py mas não quero que use endwith quero encontrar e imprimir linhas que contenham um nome particular ... como quero imprimir a linha da enorme planilha do excel que contém os dados do john e não os do bob. Socorro?
novak
Eu sugiro que você poste isso como uma pergunta separada e coloque o código em um bloco de código.
Jon Cage
Esta é a segunda questão de uma série de questões relacionadas; na 3ª pergunta, é revelado que o arquivo Excel real supostamente tem 1,5 GB e a memória do computador é descrita como "insuficiente" ... consulte stackoverflow.com/questions/3241039/…
John Machin
16

Isso não é tão simples quanto abrir um arquivo de texto simples e exigirá algum tipo de módulo externo, já que não há nada embutido para fazer isso. Aqui estão algumas opções:

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

Se possível, você pode querer exportar a planilha do Excel como um arquivo CSV e, em seguida, usar o módulo python csv integrado para lê-la:

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

Donald Miner
fonte
Ok, eu realmente não entendo as coisas CSV, como faço para python abrir meu arquivo excel como um módulo csv? Eu tenho um programa que faz o que eu quero para arquivos txt e eu quero fazer a mesma coisa para este arquivo excel ... qual é o melhor caminho a seguir? Você pode elaborar sobre isso, por favor?
novak
Você pode usar um módulo python de terceiros como o xlrd ou salvar seu arquivo do Excel em um arquivo CSV, em vez de um arquivo normal do Excel. Acho que o que está faltando é que um arquivo do Excel não tem nenhuma semelhança com um arquivo de texto simples. Abra o documento do Excel no bloco de notas e você verá o que quero dizer. Você precisa salvar o arquivo em um formato de texto simples, como CSV (valores separados por vírgula), que é mais fácil de ler com python, ou instalar e usar um módulo de terceiros que pode analisar um arquivo Excel para você.
Donald Miner
O problema que estou tendo é que o arquivo é muito grande. Como posso salvar o arquivo no formato CSV se não consigo abri-lo completamente?
novak
@novak: Seu problema é que seu arquivo tem 1,5 GB e a memória do seu computador "não é suficiente" ...
John Machin
6

Existe o pacote 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()
palavras para o sábio
fonte
1

Isso pode ajudar:

Isso cria um nó que pega uma Lista 2D (lista de itens da lista) e os coloca na planilha do Excel. certifique-se de que os IN [] s estão presentes ou lançará uma exceção.

esta é uma reescrita do nó dínamo do Revit Excel para o Excel 2013, pois o nó pré-empacotado padrão continuava quebrando. Eu também tenho um nó de leitura semelhante. A sintaxe do Excel em Python é delicada.

thnx @CodingNinja - atualizado:)

###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")
Apsis0215
fonte
@CodingNinja Isso é suficiente? :)
Apsis0215
Sim, muito melhor
0

Este código funcionou para mim com Python 3.5.2. Ele abre, salva e se destaca. Atualmente, estou trabalhando em como salvar dados no arquivo, mas este é o código:

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

 

J.ravat
fonte
-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)

Agora você pode usar o poder dos DataFrames do pandas!

Malcolm Monroe
fonte
1
A questão é sobre como ler um arquivo Excel, não um arquivo de texto separado por vírgulas. O Pandas parece ter uma função para isso ( pandas.read_excel).
Bart