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ý).
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...
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:
def xlsx(fname):import zipfile
from xml.etree.ElementTreeimport 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.ElementTreeimport 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 stringsif element.tag.endswith('}v')or element.tag.endswith('}t'):
value = element.text
# If value is a shared string, use value as an indexif 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.
(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))
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)
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ý).fonte
.xlsx
), você provavelmente usaria OpenPyXL .Usando pandas:
fonte
Você pode escolher qualquer um deles http://www.python-excel.org/
Eu recomendaria a biblioteca xlrd python.
instale-o usando
importar usando
para abrir uma pasta de trabalho
folha aberta por nome
folha aberta por índice
ler o valor da célula
fonte
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 aread_excel
função que funciona perfeitamente:PS Você precisa ter o
xlrd
instalado para que aread_excel
função funcioneAtualização 21-03-2020: como você pode ver aqui , há problemas com o
xlrd
mecanismo e ele será descontinuado. Oopenpyxl
é o melhor substituto. Portanto, conforme descrito aqui , a sintaxe canônica deve ser:fonte
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.
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.
fonte
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.
fonte
xlwt
arquivos WriTes; usarxlrd
para arquivos ReaD.Se você precisar do formato XLS antigo. Código abaixo para ansii 'cp1251'.
fonte
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:
fonte
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.
fonte
xls2csv
, em seguida, analisar ocsv
do Python?Para arquivos Excel mais antigos, existe o módulo OleFileIO_PL que pode ler o formato de armazenamento estruturado OLE usado.
fonte
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
fonte