Qual é a melhor maneira de ler arquivos Excel (XLS) com Python (não arquivos CSV ).
Existe um pacote embutido que é suportado por padrão em Python para fazer esta tarefa?
Qual é a melhor maneira de ler arquivos Excel (XLS) com Python (não arquivos CSV ).
Existe um pacote embutido que é suportado por padrão em Python para fazer esta tarefa?
Respostas:
Eu recomendo fortemente o xlrd para ler .xls
arquivos.
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 .xlsx
arquivos mais recentes , a biblioteca recomendada para leitura e gravação parece ser openpyxl (obrigado, Ikar Pohorský).
.xlsx
), você provavelmente usaria OpenPyXL .
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...
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
Acho que o Pandas é o melhor caminho a seguir. Já existe uma resposta aqui com o Pandas usando a ExcelFile
função, mas não funcionou corretamente para mim. A partir daqui , encontrei a read_excel
funçã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 xlrd
instalado para que a read_excel
função funcione
Atualização 21-03-2020: como você pode ver aqui , há problemas com o xlrd
mecanismo 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")
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
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.
xlwt
arquivos WriTes; usar xlrd
para arquivos ReaD.
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))
O Python Excelerator também lida com essa tarefa. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Também está disponível no Debian e Ubuntu:
sudo apt-get install python-excelerator
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.
xls2csv
, em seguida, analisar o csv
do Python?
Para arquivos Excel mais antigos, existe o módulo OleFileIO_PL que pode ler o formato de armazenamento estruturado OLE usado.
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)