Abspeichern multipler Excel Files in neuem Ordner

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Kringel
User
Beiträge: 2
Registriert: Montag 1. August 2022, 19:28

Hallo zusammen,

Ich bin erst vor Kurzem mit Python gestartet, also wirklich ein Newby und ganz neu im Forum. Das heißt, das stimmt nicht ganz, aber bislang war ich stille Mitleserin. Nun habe ich folgendes Problem, zu dem ich bislang einfach keine Lösung finden konnte (trotz google und Forumsuche).

Ich möchte eine Reihe von Excel-Dateien, die jeweils aus mehreren Sheets bestehen, einlesen, umformatieren bzw. für weitere Berechnungen nutzen und dann in einem neuen Ordner wieder abspeichern. Und hier liegt das Problem. Ich schaffe es, entweder ein Excel-File mit vorgegebenem Namen in einem neuen Ordner abzuspeichern, oder alle Excel-Files in dem Ordner abzuspeichern, aus dem die Dateien auch geladen wurden. Sobald ich aber alle Excel-Dateien in einem neuen (Unter)ordner speichern möchte, klappt nichts mehr und mir ist nicht klar, warum sich nicht beides (neuer Ordner und Index) kombinieren lässt :? . Es soll aber ein neuer Ordner sein, weil ich mir die Originaldateien nicht überschreiben möchte. Mein bisheriger Code sieht etwa so aus:

import pandas as pd
import glob
File_Path = r"C:/Users/Name/Desktop/Testfiles"
Files = glob.glob(File_Path + "/*.xlsx")

#### Excel-Files einlesen
for file in Files:
# Metadaten einlesen
df_meta = pd.read_excel(file, sheet_name="Meta Data", header=None)

# Daten einlesen
df_data = pd.read_excel(file, sheet_name="Data")

# HIER STEHT CODE, DER DIE FILES UMFORMATIERT

# Write Output Files
writer = pd.ExcelWriter("C:/Users/Name/Desktop/Testfiles/Out/file.xlsx", engine='xlsxwriter') # Für eine Datei in neuem Ordner
# writer = pd.ExcelWriter(file, engine='xlsxwriter') # Für alle Dateien im selben Ordner
df_meta.to_excel(writer, index=False, header=False, sheet_name="Meta Data") # Erstes Blatt
df_data.to_excel(writer, index=False, sheet_name="Data", na_rep='NaN', float_format="%.2f") # Zweites Blatt
writer.sheets['Data'].set_column(0, 8, 17)
writer.save()

Ich freue mich über hilfreiche Tipps.
Vielen Dank und allen einen guten Abend!
Kringel
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Vielleicht möchtest du dich einmal mit pathlib beschäftigen.
Das ist das Modul, das man verwendet, wenn es um Pfade geht.

Code: Alles auswählen

>>> import pathlib
>>> path = pathlib.Path("c:/test")
>>> path / "subdir" / "filenane.xlsx"
WindowsPath('c:/test/subdir/filenane.xlsx')
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt nur den neuen Pfad richtig zusammenbauen. Dazu gibt es pathlib.Path.
Konstanten schreibt man KOMLETT_GROSS, Variablennamen komplett_klein.
pd.Excelwriter benutzt man mit dem with-Statement.

Code: Alles auswählen

from pathlib import Path
import pandas as pd

FILEPATH = Path("C:/Users/Name/Desktop/Testfiles")
OUTPUTPATH = Path("C:/Users/Name/Desktop/Testfiles/Out")

for filename in FILEPATH.glob('*.xlsx'):
    df_meta = pd.read_excel(filename, sheet_name="Meta Data", header=None)
    df_data = pd.read_excel(filename, sheet_name="Data")

    # HIER STEHT CODE, DER DIE FILES UMFORMATIERT
            
    with pd.ExcelWriter(OUTPUTPATH / filename.name, engine='xlsxwriter') as writer:
        df_meta.to_excel(writer, index=False, header=False, sheet_name="Meta Data")  # Erstes Blatt
        df_data.to_excel(writer, index=False, sheet_name="Data", na_rep='NaN', float_format="%.2f") # Zweites Blatt
        writer.sheets['Data'].set_column(0, 8, 17)
Kringel
User
Beiträge: 2
Registriert: Montag 1. August 2022, 19:28

Vielen Dank für die beiden schnellen Antworten und auch für die Hinweise zu den Python-Konventionen!

Genau am 'nur den neuen Pfad richtig zusammenbauen' war ich gescheitert. Ich hatte allerdings gehofft (und befürchtet), dass die Lösung so einfach ist. Ich hatte es zuvor z.B. bereits mit os.path.join versucht, aber irgendwo war immer ein Fehler...

So funktioniert es jetzt aber. Danke!
Antworten