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 .xlsxDateien scheint die empfohlene Bibliothek zum Lesen und Schreiben openpyxl zu sein (danke, Ikar Pohorský).
Für Excel 2007+ Dateien ( .xlsx) würden Sie wahrscheinlich OpenPyXL verwenden .
Ikar Pohorský
48
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...
Der "Zellenwert lesen" funktioniert nicht ... er löst einen TypeError aus: Das 'Sheet'-Objekt kann nicht aufgerufen werden. Der Rest hat super geklappt.
Newbielp
13
Ich denke, Pandas ist der beste Weg. Es gibt bereits eine Antwort hier mit Pandas mit ExcelFileFunktion, aber es funktionierte nicht richtig für mich. Von hier aus habe ich die read_excelFunktion 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 xlrdinstalliert haben, damit die read_excelFunktion funktioniert
Update 21-03-2020: Wie Sie hier sehen können , gibt es Probleme mit der xlrdEngine und sie wird veraltet sein. Das openpyxlist der beste Ersatz. Wie hier beschrieben , sollte die kanonische Syntax wie folgt lauten:
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
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.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
(1) Pyxlreader ist die absolute Pocken. Sie dürfen es noch nie versucht haben. Siehe meine Kommentare hier: stackoverflow.com/questions/1243545/… (2) xlwtWriTes-Dateien; verwenden xlrd, um Dateien zu lesen.
John Machin
2
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))
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)
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ý).quelle
.xlsx
) würden Sie wahrscheinlich OpenPyXL verwenden .Pandas benutzen:
quelle
Sie können eine davon auswählen http://www.python-excel.org/
Ich würde die Python xlrd-Bibliothek empfehlen.
Installieren Sie es mit
importieren mit
eine Arbeitsmappe öffnen
Blatt nach Namen öffnen
Blatt nach Index öffnen
Zellenwert lesen
quelle
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 dieread_excel
Funktion gefunden, die gut funktioniert:PS Sie müssen die
xlrd
installiert haben, damit dieread_excel
Funktion funktioniertUpdate 21-03-2020: Wie Sie hier sehen können , gibt es Probleme mit der
xlrd
Engine und sie wird veraltet sein. Dasopenpyxl
ist der beste Ersatz. Wie hier beschrieben , sollte die kanonische Syntax wie folgt lauten:quelle
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.
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.
quelle
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.
quelle
xlwt
WriTes-Dateien; verwendenxlrd
, um Dateien zu lesen.Wenn Sie ein altes XLS-Format benötigen. Unten Code für ansii 'cp1251'.
quelle
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:
quelle
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.
quelle
xls2csv
und dann dascsv
von Python zu analysieren ?Für ältere Excel-Dateien gibt es das OleFileIO_PL-Modul , das das verwendete strukturierte OLE-Speicherformat lesen kann.
quelle
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
quelle