Was ist der beste Weg, um Excel (XLS) -Dateien mit Python zu lesen (keine CSV- Dateien) ?
Gibt es ein integriertes Paket, das in Python standardmäßig für diese Aufgabe unterstützt wird?
Was ist der beste Weg, um Excel (XLS) -Dateien mit Python zu lesen (keine CSV- Dateien) ?
Gibt es ein integriertes Paket, das in Python standardmäßig für diese Aufgabe unterstützt wird?
Antworten:
Ich empfehle xlrd zum Lesen von .xls
Dateien.
voyager erwähnte die Verwendung der COM-Automatisierung. Nachdem Sie dies vor einigen Jahren selbst getan haben, seien Sie gewarnt, dass dies eine echte PITA ist. Die Anzahl der Vorbehalte ist enorm und die Dokumentation fehlt und ist ärgerlich. Ich stieß auf viele seltsame Käfer und Fallstricke, von denen einige viele Stunden brauchten, um herauszufinden.
UPDATE: Für neuere .xlsx
Dateien scheint die empfohlene Bibliothek zum Lesen und Schreiben openpyxl zu sein (danke, Ikar Pohorský).
.xlsx
) würden Sie wahrscheinlich OpenPyXL verwenden .
Pandas benutzen:
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...
Sie können eine davon auswählen http://www.python-excel.org/
Ich würde die Python xlrd-Bibliothek empfehlen.
Installieren Sie es mit
pip install xlrd
importieren mit
import xlrd
eine Arbeitsmappe öffnen
workbook = xlrd.open_workbook('your_file_name.xlsx')
Blatt nach Namen öffnen
worksheet = workbook.sheet_by_name('Name of the Sheet')
Blatt nach Index öffnen
worksheet = workbook.sheet_by_index(0)
Zellenwert lesen
worksheet.cell(0, 0).value
Ich denke, Pandas ist der beste Weg. Es gibt bereits eine Antwort hier mit Pandas mit ExcelFile
Funktion, aber es funktionierte nicht richtig für mich. Von hier aus habe ich die read_excel
Funktion gefunden, die gut funktioniert:
import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))
PS Sie müssen die xlrd
installiert haben, damit die read_excel
Funktion funktioniert
Update 21-03-2020: Wie Sie hier sehen können , gibt es Probleme mit der xlrd
Engine und sie wird veraltet sein. Das openpyxl
ist der beste Ersatz. Wie hier beschrieben , sollte die kanonische Syntax wie folgt lauten:
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
Für xlsx gefällt mir die Lösung, die zuvor als https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python veröffentlicht wurde . Ich verwende nur Module aus der Standardbibliothek.
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
Zu den hinzugefügten Verbesserungen gehört das Abrufen von Inhalten nach Blattnamen, das Abrufen der Spalte mit re und das Überprüfen, ob gemeinsam genutzte Zeichenfolgen verwendet werden.
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
Sie können jede der hier aufgelisteten Bibliotheken (wie Pyxlreader , das auf JExcelApi oder xlwt basiert ) sowie die COM-Automatisierung verwenden, um Excel selbst zum Lesen der Dateien zu verwenden. Dafür führen Sie Office jedoch als Abhängigkeit Ihrer Software ein. Das ist möglicherweise nicht immer eine Option.
xlwt
WriTes-Dateien; verwenden xlrd
, um Dateien zu lesen.
Wenn Sie ein altes XLS-Format benötigen. Unten Code für 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 übernimmt auch diese Aufgabe. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Es ist auch in Debian und Ubuntu verfügbar:
sudo apt-get install python-excelerator
Sie können auch das (Nicht-Python-) Programm xls2csv ausführen. Füttere es mit einer XLS-Datei, und du solltest eine CSV zurückbekommen.
xls2csv
und dann das csv
von Python zu analysieren ?
Für ältere Excel-Dateien gibt es das OleFileIO_PL-Modul , das das verwendete strukturierte OLE-Speicherformat lesen kann.
with open(csv_filename) as file:
data = file.read()
with open(xl_file_name, 'w') as file:
file.write(data)
Sie können CSV mit eingebauten Paketen wie oben beschrieben auszeichnen. CSV kann mit einem integrierten Paket aus Diktierern und Diktierern verarbeitet werden, das genauso funktioniert wie das Python-Wörterbuch. Das macht es eine Menge einfacher. Ich kenne derzeit keine eingebauten Excel-Pakete, aber ich bin auf openpyxl gestoßen. Es war auch ziemlich einfach und unkompliziert. Sie können das Code-Snippet unten sehen, hoffen, dass dies hilft
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']
print(result.value)