Lesen / Parsen von Excel (xls) -Dateien mit Python


Antworten:


91

Ich empfehle xlrd zum Lesen von .xlsDateien.

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ý).


5
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...

1
pandas benutzt xlrd, um zu lesen; Sie müssen auch xlrd als Abhängigkeit installieren
congusbongus

25

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    

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:

dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")

AttributeError: Das Objekt 'dict' hat kein Attribut 'head'
lopezdp

4

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

Vielen Dank für die Wiederbelebung meiner Antwort!
Collin Anderson

2

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.


6
(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))


0

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.


3
Aber das Poster sagt, dass er in Python lesen muss ... Schlagen Sie vor, zu laufen xls2csvund dann das csvvon Python zu analysieren ?
Carver

Python-Excelerator enthält einen ausführbaren py_xls2csv-Wrapper um einen Python-Konverter.
fatal_error


0
    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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.