Qual è il modo migliore per leggere file Excel (XLS) con Python (non file CSV ).
Esiste un pacchetto integrato supportato per impostazione predefinita in Python per eseguire questa attività?
Qual è il modo migliore per leggere file Excel (XLS) con Python (non file CSV ).
Esiste un pacchetto integrato supportato per impostazione predefinita in Python per eseguire questa attività?
Risposte:
Consiglio vivamente xlrd per leggere i .xls
file.
voyager ha menzionato l'uso dell'automazione COM. Avendolo fatto io stesso alcuni anni fa, tieni presente che farlo è una vera PITA. Il numero di avvertimenti è enorme e la documentazione è carente e fastidiosa. Mi sono imbattuto in molti strani bug e trucchi, alcuni dei quali hanno richiesto molte ore per capirlo.
AGGIORNAMENTO: Per i .xlsx
file più recenti , la libreria consigliata per la lettura e la scrittura sembra essere openpyxl (grazie, Ikar Pohorský).
.xlsx
) probabilmente useresti OpenPyXL .
Usare i panda:
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...
Puoi sceglierne uno qualsiasi http://www.python-excel.org/
Suggerirei la libreria xlrd di python.
installalo usando
pip install xlrd
importare utilizzando
import xlrd
per aprire una cartella di lavoro
workbook = xlrd.open_workbook('your_file_name.xlsx')
foglio aperto per nome
worksheet = workbook.sheet_by_name('Name of the Sheet')
foglio aperto per indice
worksheet = workbook.sheet_by_index(0)
leggere il valore della cella
worksheet.cell(0, 0).value
Penso che Pandas sia il modo migliore per andare. C'è già una risposta qui con Panda che usa la ExcelFile
funzione, ma non ha funzionato correttamente per me. Da qui ho trovato la read_excel
funzione che funziona benissimo:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
PS È necessario che la funzione sia xlrd
installata affinché read_excel
funzioni
Aggiornamento 21-03-2020: come puoi vedere qui , ci sono problemi con il xlrd
motore e sarà deprecato. Il openpyxl
è il miglior sostituto. Quindi, come descritto qui , la sintassi canonica dovrebbe essere:
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
Per xlsx mi piace la soluzione pubblicata in precedenza come https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . Uso solo i moduli della libreria standard.
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
I miglioramenti aggiunti sono il recupero del contenuto in base al nome del foglio, l'utilizzo di re per ottenere la colonna e il controllo se vengono utilizzate le sharedstrings.
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
Puoi utilizzare una qualsiasi delle librerie elencate qui (come Pyxlreader basato su JExcelApi o xlwt ), oltre all'automazione COM per utilizzare Excel stesso per la lettura dei file, ma per questo stai introducendo Office come dipendenza del tuo software, che potrebbe non essere sempre un'opzione.
xlwt
file scrive; utilizzare xlrd
per i file ReaD.
Se hai bisogno del vecchio formato XLS. Di seguito il codice per 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))
Python Excelerator gestisce anche questa attività. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
È disponibile anche in Debian e Ubuntu:
sudo apt-get install python-excelerator
Potresti anche considerare di eseguire il programma (non python) xls2csv. Alimentalo con un file xls e dovresti recuperare un csv.
xls2csv
, quindi analizzare il csv
da Python?
Per i file Excel meno recenti è disponibile il modulo OleFileIO_PL in grado di leggere il formato di archiviazione strutturato OLE utilizzato.
with open(csv_filename) as file:
data = file.read()
with open(xl_file_name, 'w') as file:
file.write(data)
Puoi trasformare CSV in Excel come sopra con pacchetti integrati. CSV può essere gestito con un pacchetto integrato di dictreader e dictwriter che funzionerà allo stesso modo del dizionario Python. il che lo rende molto facile, al momento non sono a conoscenza di alcun pacchetto integrato per Excel, ma mi sono imbattuto in openpyxl. Era anche abbastanza semplice e diretto Puoi vedere lo snippet di codice qui sotto sperando che questo aiuti
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']
print(result.value)
Per i .xls
file più vecchi , puoi usarexlrd
o puoi usarlo xlrd
direttamente importandolo. Come sotto
import xlrd
wb = xlrd.open_workbook(file_name)
Oppure puoi anche usare il pd.read_excel()
metodo pandas , ma non dimenticare di specificare il motore, sebbene l'impostazione predefinita sia xlrd
, deve essere specificato.
pd.read_excel(file_name, engine = xlrd)
Entrambi funzionano per .xls
formati di file precedenti . Infatti mi sono imbattuto in questo quando l'ho usato OpenPyXL
, ho ricevuto l'errore di seguito
InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.