Ler / analisar arquivos Excel (xls) com Python


Respostas:


91

Eu recomendo fortemente o xlrd para ler .xlsarquivos.

voyager mencionou o uso de automação COM. Tendo feito isso há alguns anos, esteja avisado de que fazer isso é um verdadeiro PITA. O número de advertências é enorme e a documentação é irritante e insuficiente. Encontrei muitos bugs e pegadinhas estranhos, alguns dos quais levaram muitas horas para descobrir.

ATUALIZAÇÃO: Para .xlsxarquivos mais recentes , a biblioteca recomendada para leitura e gravação parece ser openpyxl (obrigado, Ikar Pohorský).


5
Para arquivos do Excel 2007+ ( .xlsx), você provavelmente usaria OpenPyXL .
Ikar Pohorský

48

Usando pandas:

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

1
o pandas está usando o xlrd para fazer a leitura; você também precisará instalar o xlrd como uma dependência
congusbongus

25

Você pode escolher qualquer um deles http://www.python-excel.org/
Eu recomendaria a biblioteca xlrd python.

instale-o usando

pip install xlrd

importar usando

import xlrd

para abrir uma pasta de trabalho

workbook = xlrd.open_workbook('your_file_name.xlsx')

folha aberta por nome

worksheet = workbook.sheet_by_name('Name of the Sheet')

folha aberta por índice

worksheet = workbook.sheet_by_index(0)

ler o valor da célula

worksheet.cell(0, 0).value    

O "valor da célula de leitura" não funciona ... levanta um TypeError: o objeto 'Folha' não pode ser chamado. Todo o resto funcionou muito bem.
Newbielp

13

Acho que o Pandas é o melhor caminho a seguir. Já existe uma resposta aqui com o Pandas usando a ExcelFilefunção, mas não funcionou corretamente para mim. A partir daqui , encontrei a read_excelfunção que funciona perfeitamente:

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

PS Você precisa ter o xlrdinstalado para que a read_excelfunção funcione

Atualização 21-03-2020: como você pode ver aqui , há problemas com o xlrdmecanismo e ele será descontinuado. O openpyxlé o melhor substituto. Portanto, conforme descrito aqui , a sintaxe canônica deve ser:

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

AttributeError: objeto 'dict' não tem atributo 'head'
lopezdp

4

Para xlsx, gosto da solução postada anteriormente como https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . Eu uso módulos da biblioteca padrão apenas.

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

As melhorias adicionadas são a busca de conteúdo por nome de folha, usando re para obter a coluna e verificando se strings compartilhadas são usadas.

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

Obrigado por reavivar minha resposta!
Collin Anderson

2

Você pode usar qualquer uma das bibliotecas listadas aqui (como Pyxlreader que é baseado em JExcelApi ou xlwt ), além da automação COM para usar o próprio Excel para a leitura dos arquivos, mas para isso você está introduzindo o Office como uma dependência de seu software, o que pode nem sempre ser uma opção.


6
(1) pyxlreader é a varíola absoluta. Você nunca deve ter tentado. Veja meus comentários aqui: stackoverflow.com/questions/1243545/… (2) xlwtarquivos WriTes; usar xlrdpara arquivos ReaD.
John Machin

2

Se você precisar do formato XLS antigo. Código abaixo para 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))


0

Você também pode considerar a execução do programa (não-python) xls2csv. Alimente-o com um arquivo xls e você deverá obter um csv.


3
Mas o autor da postagem diz que precisa ler em Python ... Você está sugerindo executar e xls2csv, em seguida, analisar o csvdo Python?
hcarver

Python-excelerator contém um wrapper executável py_xls2csv em torno de um conversor Python.
fatal_error


0
    with open(csv_filename) as file:
        data = file.read()

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

Você pode transformar CSV para se destacar como acima com pacotes embutidos. CSV pode ser manipulado com um pacote embutido de dictreader e dictwriter, que funcionará da mesma maneira que o dicionário python. o que torna muito mais fácil. Atualmente, não tenho conhecimento de quaisquer pacotes embutidos para o Excel, mas eu encontrei o openpyxl. Também foi bastante direto e simples Você pode ver o trecho de código abaixo, espero que isso ajude

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.