Ordnerpfad finden und Ordner einfügen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Eneri_Gnats
User
Beiträge: 20
Registriert: Freitag 14. Februar 2020, 11:17

Hallo Zusammen,

Ich habe folgendes Problem:

Ich möchte ein dataframe als csv speichern und zwar in einem Ordner den ich beim durchlaufen des Skriptes erstelle (mithilfe eines Zeitstempels sollen die Ordner unterschiedlich benannt werden).
Mein Code sieht wie folgt aus:

Code: Alles auswählen

namecsv = now.strftime('%d.%m_%H.%M.%S')
speicherpfad = os.getcwd()+ '\\Ergebnisse\\'
Ordner = 'Berechnung_' + namecsv 
os.mkdir(os.path.join(speicherpfad, Ordner))
bei os.mkdir tritt der fehler auf. Der ORdnerpfad wird nicht gefunden:
FileNotFoundError: [WinError 3] Das System kann den angegebenen Pfad nicht finden: 'C:\\Users\\igors\\Documents\\Projekte\\Simulationsumgebung\\Ergebnisse\\Berechnung_14.02_11.36.38'

Wie kann ich den Ordner richtig ansprechen und darin den Ordner Berechnung_aktuelles Datum anlegen

Die nächste Frage ist wie ich dann in diesem Ordner die csv datei speichern kann?

Code: Alles auswählen

df.to_csv(os.path.join(speicherpfad, r'Doc.csv'), index = False)
ich hoffe es kann mir hier jemand helfen :)

Viele Grüße
Eneri
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

os.mkdir kann nur das *letzte* Verzeichnis erstellen, das in einem Pfad angegeben wurde. Es gibt aber auch noch os.makedirs.

Und dann solltest du deinen Ordner auch als Variable ablegen, und nicht on-the-fly in allen moeglichen Ausdruecken per os.path.join zusammenstoppeln. Sondern einmal

Code: Alles auswählen

ordner = os.path.join(speicherpfad, 'Berechnung_{}'.format(namecsv)
Denn dann kannst du den immer weiter benutzen, und machst keinen Fehler wie gezeigt im df.to_csv, denn da fehlt ja der eigentliche Unterordner ploetzlich wieder.

Last but not least: du benutzt doch schon os.path.join mehrfach, warum nicht auch bei der Erstellung von speicherpfad?
Eneri_Gnats
User
Beiträge: 20
Registriert: Freitag 14. Februar 2020, 11:17

Danke für die Schnelle Antwort.

so hab ich das jetzt angepasst: ich sage das speicherpfad der folgende Pfad ist bis zum Ordner Ergebnisse, den es gibt. Die variable ordner Joint den speicherpfad und den zu erstellenden Ordner der abhängig von der Zeit benannt sein soll. dazu die variable "namecsv"

Code: Alles auswählen

namecsv = now.strftime('%d.%m_%H.%M.%S')

speicherpfad = os.getcwd()+ '\\Ergebnisse\\' # diesen Ordner gibt es schon
ordner = os.path.join(speicherpfad, 'Berechnung_{}'.format(namecsv) )# der Ordner 'Berechnung_aktuellezeit' soll angelegt werden
os.mkdir(ordner) #der letzte Eintrag "Berechnung_aktuelle Zeit" soll erstellt werden
df.to_csv('dataframe.csv') # dataframe in csv wo wird das jetzt gespeichert?
die csv Datei soll in diesem erstellten Ordner gespeichert werden. aber wie sag ich der df.to_csv wo sie das Doc speichern soll?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Pfade stückelt man nicht mit + zusammen und die Methoden aus os sind auch zu low-level, als dass man sie benutzen möchte.
Statt dessen benutzt man pathlib.Path. Datumsangaben in Dateinamen sollten immer die Form YYYY-mm-dd-HH-MM-SS haben, also von großen nach kleinen Zeiteinheiten sortiert sein.

Code: Alles auswählen

from pathlib import Path
SPEICHERPFAD = Path("Ergebnisse").absolute()

aktuelle_zeit = now.strftime('%Y.%m.%d_%H.%M.%S')
ordner = SPEICHERPFAD / f"Berechnung_{aktuelle_zeit}"
ordner.mkdir()
df.to_csv(ordner / 'dataframe.csv')
Eneri_Gnats
User
Beiträge: 20
Registriert: Freitag 14. Februar 2020, 11:17

bin mir nicht sicher ob ich das jetzt richtig umgesetzt habe weil immer noch eine Fehlermeldung auftaucht:
Fehlermeldung:
FileNotFoundError: [WinError 3] Das System kann den angegebenen Pfad nicht finden: 'C:\\Users\\igors\\Documents\\Projekte\\Simulationsumgebung\\Ergebnisse\\Berechnung_02.14_14.19.46'

Code:

Code: Alles auswählen

df = pd.DataFrame({'PI_system': overloads_pi_flow[0]})

speicherpfad = Path("Ergebnisse").absolute()
aktuelle_zeit = now.strftime('%m.%d_%H.%M.%S')
ordner = speicherpfad / f"Berechnung_{aktuelle_zeit}"
ordner.mkdir()
df.to_csv(ordner / 'dataframe.csv')
der fehler tritt ein bei ordner.mkdir() kann es sein dass es daran liegt dass mein rechner nicht mit den "\\" klar kommt und eher "\" brauch?
Eneri_Gnats
User
Beiträge: 20
Registriert: Freitag 14. Februar 2020, 11:17

wenn ich speicherpfad = r'C:\Users\igors\Documents\Projekte\Ergebnisse' setze dann wird der pfad gefunden. aber ich will den speicherpfad variable haben und nicht fix da ich an verschiednen Rechnern arbeite
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Das übergeordnete Verzeichnis existiert noch nicht. `ordner.mkdir` hat dafür passende Parameter.
Warum hast Du das Jahr aus dem Datum herausgenommen? Bist Du sicher, dass nächstes Jahr das Programm nicht mehr eingesetzt wird?
Eneri_Gnats
User
Beiträge: 20
Registriert: Freitag 14. Februar 2020, 11:17

ja genau nächstes Jahr wird das ganze nicht mehr verwendet (ist meine Masterarbeit) der Doktorand wird die ausführliche Dokumentation nicht benötigen.
mit übergeordnetes Verzeichnis meinst du den Ordner "Ergebnisse"? den gibt es aber bereits.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Irgendeinen Pfad gibt es nicht. Schau ganz genau hin, wir koennen ja nicht wissen, was da auf deinem System so los ist. Ich wuerde zum Test oder gar generell auch einen absoluten Pfad verwenden, denn sonst legt das Skript relativ zum Arbeitsverzeichnis Dateien an. Ist das gewollt? Also, ist das ein Feature?
Eneri_Gnats
User
Beiträge: 20
Registriert: Freitag 14. Februar 2020, 11:17

Ja das ist gewollt weil ich an unterschiedlichen rechnern arbeit und die Dokumente immer im ordern "Ergebnisse" in einem Unterorder "Berechnung_..Zeit.." gespeichert werden sollen.
Den Ordner Ergebnisse gibt es. ich denke das Problem sind die \\ im Pfad. Eigentlich sollten es \ also nur einmal sein damit es als pfad erkannt wird oder?
ich sollte herausfinden wie ich die variable "speicherpfad" so erstelle dass nur ein \ angegeben wird...geht das?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke nicht, dass die \\ das Problem sind. Aber wenn sie es waeren, kannst du sie mit einem / ersetzen. In normalen Python-Strings musst du \\ schreiben, damit du mit \ endest. Das hat was mit string-escaping zu tun. Auf jeden Fall ist es nicht das Problem. Ich wuerde mir mal print(ordner) ausgeben lassen, direkt bevor das mkdir versucht wird. Und dann *SEHR* genau hinschauen, auch und gerade in Bezug auf Leerzeichen im Pfad, ob das denn alles so stimmt. Und du musst natuerlich die Berechtigung haben, im Pfad auch ein Verzeichnis anlegen zu duerfen.
Antworten