@Bl3nder: `Datenbank()` ist kein sinnvoller Funktionsname. Per Kovention muss der sowieso klein_mit_unterstrichen sein, wie alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Und er sollte die Tätigkeit beschreiben, die die Funktion durch führt. `Datenbank` ist keine Tätigkeit.
Daten wie die Dateinamen sollte man als Konstanten definieren und den gemeinsamen Präfix am besten auch dort heraus ziehen.
`ExcelWriter` kennt für das erstellen ein `mode`-Argument das `a` für „append“ sein kann. Damit muss man die Daten nicht selbst in das `book`-Attribut laden.
Den Hack mit dem `sheets`-Attribut sollte man auf jeden Fall dokumentieren, damit niemand a) auf die Idee "openpyxl" als `engine` zu ändern, und man b) gleich weiss wo man mit suchen anfangen kann, falls das mal nicht mehr funktioniert weil sich die Implementierung geändert hat, und es das nicht-öffentliche `sheet`-Attribut nicht mehr gibt.
Warum ``len(df.index.values)`` statt einfach ``len(df)``? `test` ist auch ein sehr unpassender Name an der Stelle.
Das verpacken des `Series`-Objekts in einen neuen `DataFrame` und Transponieren vorm schreiben kann man sich sparen wenn man die Zeile gleich als einen `DataFrame` selektiert den man direkt schreiben kann.
`ExcepWriter`-Objekte sind Kontextmanager und können und sollten mit ``with`` verwendet werden.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
from pathlib import Path
import pandas as pd
BASE_PATH = Path("C:/Users/Marcel/Desktop/Klimareport Test Ordner")
TEST_EXCEL_FILE_PATH = BASE_PATH / "Test.xlsx"
NEW_DATA_EXCEL_FILE_PATH = BASE_PATH / "Aktuell.1.xlsx"
NEW_DATA_EXCEL_SHEET_NAME = "Statistik C"
def extend_excel_sheet():
#
# Attention: This is a hack to append data to an existing sheet. It works
# with the "openpyxl" engine as long as that uses the non public `sheets`
# attribute so this hack works.
#
with pd.ExcelWriter(
TEST_EXCEL_FILE_PATH, engine="openpyxl", mode="a"
) as writer:
writer.sheets = {sheet.title: sheet for sheet in writer.book}
data = pd.read_excel(
NEW_DATA_EXCEL_FILE_PATH, NEW_DATA_EXCEL_SHEET_NAME, header=None
)
data.dropna(how="all").iloc[[3]].to_excel(
writer, header=None, index=None, startrow=len(data) + 1, startcol=2
)
if __name__ == "__main__":
extend_excel_sheet()
Ist eigentlich garantiert, dass es nach dem filtern der NaN-Zeilen Daten in Zeile 4 gibt? Falls nicht, ist das eine potentielle Fehlerquelle.