Python Finden, die höchste Zeile in einer bestimmten Spalte
Ich bin ganz neu in stackoverflow und vor kurzem gelernt, einige grundlegende Python. Dies ist das erste Zeit bin ich mit openpyxl. Bevor ich xlrd und xlsxwriter und ich habe es geschafft, einige nützliche Programme. Aber jetzt brauche ich eine .xlsx-reader&writer.
Gibt es eine Datei, die ich brauche zu Lesen und zu Bearbeiten mit Daten, die schon gespeichert im code. Nehmen wir an, die .xlsx hat fünf Spalten mit Daten: A, B, C, D, E. In Spalte A habe ich über 1000 Zeilen mit Daten. Auf Spalte D habe ich 150 Zeilen mit Daten.
Im Grunde genommen, ich möchte das Programm finden Sie in der letzten Zeile mit Daten auf einer bestimmten Spalte (sagen wir D). Dann schreiben Sie die gespeicherte variable data
in die nächste verfügbare Zeile (Letzte Zeile + 1) in Spalte D.
Das problem ist, dass ich nicht verwenden können ws.get_highest_row()
da gibt es die Zeile 1000 auf Spalte A.
Eigentlich, so weit dies alles, was ich habe:
data = 'xxx'
from openpyxl import load_workbook
wb = load_workbook('book.xlsx', use_iterators=True)
ws = wb.get_sheet_by_name('Sheet1')
last_row = ws.get_highest_row()
Offensichtlich überhaupt nicht funktioniert. last_row
gibt 1000.
- Haben Sie verwenden, um
openpyxl
oder konnte verwenden Sie eine andere Bibliothek? Dieses sieht wie es könnte ein job fürpandas
-, Python -, Daten Verarbeitungs-Bibliothek. - Alles wäre perfekt, aber die Datei, die ich arbeite, ist eine xlsx. Ich habe gelesen, dass openpyxl ist der einzige, der sowohl Lesen und schreiben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, wie es mit den Pandas.
Es ist einfach , um die letzten nicht-null-Zeile in Pandas mit
last_valid_index
.Möglicherweise gibt es eine bessere Art und Weise zu schreiben, die daraus resultierende
DataFrame
zu Ihremxlsx
Datei aber laut der docs, diese sehr dumme Art und Weise ist, wie es ist getan inopenpyxl
.Lassen Sie uns sagen, Sie sind, beginnend mit diesem einfachen Arbeitsblatt:
Lassen Sie uns sagen, dass wir wollen
xxx
in SpalteC
:sind die Ergebnisse in:
Das problem ist, dass
get_highest_row()
setzt die Reihe Dimensionen Instanzen zu definieren, die maximale Zeile auf dem Blatt.RowDimension
hat keine Informationen über die Spalten - das heißt, wir können nicht es verwenden, um Ihr problem zu lösen und haben es anders Herangehen.Hier ist eine Art "hässlich" openpyxl-spezifische option, die aber nicht funktionieren würde, wenn
use_iterators=True
:Verwendung:
Abgesehen von dieser, ich würde Folgen Sie der @LondonRob Vorschlag zum analysieren des Inhalts mit
pandas
und lassen Sie es die Arbeit machen.wb = load_workbook('book.xlsx')
. Allerdings habe ich diese Traceback (most recent call last): File "C:\xx.py", line 53, in <module> drucken get_maximum_row(ws, "A") - Datei "C:\xx.py", line 51, in get_maximum_row für Zelle in ws._cells wenn cell.startswith(Spalte)) - Datei "C:\xx.py", line 51, in <genexpr> " für die Zelle in ws._cells wenn cell.startswith(Spalte)) NameError: global name 'coordinate_from_string' ist nicht definiertfrom openpyxl import load_workbook wb = load_workbook('libro.xlsx') ws = wb.get_sheet_by_name('Sheet1') from openpyxl.utils import coordinate_from_string def get_maximum_row(ws, column): return max(coordinate_from_string(cell)[-1] for cell in ws._cells if cell.startswith(column)) print get_maximum_row(ws, "A") print get_maximum_row(ws, "B") print get_maximum_row(ws, "C") print get_maximum_row(ws, "F")
vielen Dank für die harte Arbeit mit diesem code!Wenn dies ist eine Einschränkung von
openpyxl
dann könnten Sie versuchen Sie die folgenden Ansätze:csv
Modul.zipfile
und navigieren Sie dann zu der "xl/worksheets" - Unterordner des unkomprimierte Datei, und dort findest du einen XML-Code für jede Ihrer Arbeitsblätter. Von dort aus könnten Sie analysieren und aktualisieren, mitBeautifulSoup
oderlxml
.Den xslx Excel-format ist eine komprimierte (gezippte) Ordner-Baum von XML-Dateien. Finden Sie die Spezifikation hier.
Figur werde ich beginnen, die zurück zu der stackoverflow-Gemeinschaft. Alecxe ' s Lösung hat bei mir nicht funktioniert und ich wollte nicht zu verwenden, Pandas etc, so dass ich Tat dies, statt. Es wird überprüft ab Ende der Tabelle und gibt Sie der nächsten verfügbaren/leere Zeile in Spalte D.
alexce ' s Lösung hat bei mir nicht funktioniert. Es ist wahrscheinlich eine Frage der openpyxl version, ich bin auf 2.4.1, hier ist was funktionierte nach einem kleinen tweak: