Seite 1 von 1

Umgang mit Dateien

Verfasst: Donnerstag 19. Juli 2018, 14:59
von Floydl1
Danke für jeden, der mir hilft:

Ich will mit Excel-Dateien arbeiten.
Dazu importiere ich "openpyxl"
In einigen Beispielen wird folgend geschrieben:
>> from openpyxl import Workbook <<
aber egal, ob ich diesen Code setzte oder nicht, ich kann die Datei öffnen!
Frage: was passiert da? ist die zweite Ziele sinnvoll, bzw notwendig?

In anderen Sprachen war ich es gewohnt, geöffnete Dateien auch zu schliessen!
Ein "close" finde ich nicht; mit Programmende schliesst sich alles wie von selbst !!??!!
Ist das so, oder kann ich das geschickter lösen?

Re: Umgang mit Dateien

Verfasst: Donnerstag 19. Juli 2018, 15:04
von pixewakb
Laut Tutorial benötigst Du Workbook zum Schreiben eines neuen files, nicht aber zum öffnen einer Datei.

https://openpyxl.readthedocs.io/en/stable/usage.html

Ich habe mir da bislang noch nie die Implementation angesehen, aber ums Schließen einer Datei kümmerst Du Dich auch nicht, wenn Du with open(file) as f: [...] nutzt. Wahrscheinlich ist es dort vergleichbar geregelt.

Re: Umgang mit Dateien

Verfasst: Donnerstag 19. Juli 2018, 15:10
von __blackjack__
@Floydl1: Wie ”öffnest” Du denn Exceldateien mit `openpyxl`? Ich sehe da nur das die *geladen* oder *gespeichert* werden. Das ist öffnen, einlesen, schliessen, bzw. öffnen, schreiben, schliessen jeweils in einer Funktion/Methode.

Da müssen also am Programmende keine Dateien geschlossen werden weil keine geöffnet sind.

Re: Umgang mit Dateien

Verfasst: Donnerstag 19. Juli 2018, 22:45
von Floydl1
Zunächst danke für Eure schnellen Antworten. Die Links muss ich noch in Ruhe auswerten - ich bin nicht so schnell, es ist zuvieles neu!
Aber zunächst bleibt eine Ungewissheit: folgendes kleine Programm
================
# import
import openpyxl
excelDatei = openpyxl.load_workbook('Beispiel.xlsx')
sheetZahlen = excelDatei['Zahlen']
# verändern und Erweitern der Tabelle im Arbeitsspeicher
und zurückschreiben auf "sheetZahlen"
.............
excelDatei.save('Beispiel.xlsx')
excelDatei.save('andererName.xlsx')
=====================
überschreibt die Datei "Beispiel.xlsx" und erstellt mir eine neue, identische Datei "andererName.xlsx".

Re: Umgang mit Dateien

Verfasst: Donnerstag 19. Juli 2018, 22:56
von __blackjack__
Sollte so sein, ja.

Bei den Namen kannst Du Dich am besten gleich von Anfang an an klein_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase) gewöhnen. Also `zahlen_sheet` und `excel_datei`, wobei der Mix zwischen Englisch und Deutsch unschön ist und irgendwann zu Problemen führen kann wenn man überlegen muss in welcher Sprache man welche Namen oder gar Teilnamen benannt hat wenn die Definition zu weit von der aktuellen Zeile entfernt ist. Bei `excel_datei` ist zusätzlich nicht gut das es sich dabei gar nicht um ein Dateiobjekt handelt. Ich würde das hier einfach `workbook` und `sheet` nennen, es sei denn es gäbe Präfixe die wirklich etwas aussagen.

Re: Umgang mit Dateien

Verfasst: Freitag 20. Juli 2018, 06:14
von ThomasL
Floydl1 hat geschrieben: Donnerstag 19. Juli 2018, 22:45 folgendes kleine Programm

Code: Alles auswählen

excelDatei.save('Beispiel.xlsx')
überschreibt die Datei "Beispiel.xlsx".
ich weiß jetzt nicht ob ich dich richtig verstanden habe, aber wenn du das nicht möchtest, dann lass einfach diese Codezeile weg.

Re: Umgang mit Dateien

Verfasst: Freitag 20. Juli 2018, 08:27
von Floydl1
Danke für Eure Hinweise.
Mein eigentliches Problem noch einmal in anderen Worten:
a. Wenn ich (früher) in anderen Sprachen eine Datei lesen wollte, musste ich sie zum Lesen öffnen. Wenn ich schreiben wollte, zum Schreiben öffnen. War ich damit fertig, musste ich die Datei schliessen, da sonst das Betriebssystem einen undefinierten Zustand der Datei meldete.
Ich vermisse hier den klaren Umgang mit Dateien.
b. unter: https://openpyxl.readthedocs.io/en/stable/tutorial.html
steht der Befehl
from openpyxl import Workbook
der gesetzt werden soll, bevor ein neue Datei aufgebaut wird. Ich kann aber mit der einfachen Zeile
excelDatei.save('Beispiel.xlsx')
eine neue Datei erstellen?

Wozu ist der Befehl import Workbook notwendig, was bewirkt er? Diese Frage beantwortet mir die Seite unter dem Link oben nicht!

Re: Umgang mit Dateien

Verfasst: Freitag 20. Juli 2018, 09:30
von __deets__
Du hast eine falsche Vorstellung davon, was da passiert. Die Abstraktion ist viel höher als bei einer einfachen Datei. Dein Workbook speichert im Hauptspeicher alle deine Operationen als Werte und im Dokument. Da ist keine Datei beteiligt.

Wenn du dann Save aufrufst, dann wird eine Datei geöffnet, die ganzen Daten da rein geschrieben, und dann wird sie auch wieder geschlossen. Davon bekommst du nichts mit & musst auch nichts wieder schließen.

Und Importe sollten nichts weiter tun als Funktionen, Klassen und Konstanten bereit zu stellen. Und so steht das auch in der Doku.

Dann KANNST du ein leeres Workbook erzeugen mit

wb = Workbook()

Dafür gilt dann das von mir zuerst gesagte. Aber du brauchst das nicht, du lädst ja eine Datei. Und auch das ist hinter den Kulissen komplizierter, aber du musst da nix schließen.

Re: Umgang mit Dateien

Verfasst: Freitag 20. Juli 2018, 09:44
von __blackjack__
@Floydl1: Ad a. Das hat nichts mit der Programmiersprache zu tun, sondern mit der API von `openpyxl`. Du hast da nie ein Dateiobjekt selber in der Hand, weil das ja auch keinen Sinn macht Dir das an die Hand zu geben. Also musst Du auch keine Dateien schliessen. Das man Dateien die man öffnet, auch wieder schliessen sollte, gilt auch in Python. Streng genommen könntest Du das sogar machen, weil `load_workbook()` statt eines Dateinamens auch ein Dateiobjekt verwenden kann, aber dazu besteht normalerweise keine Notwendigkeit.

Ad b. Nein, Du kannst nicht einfach mit `excelDatei.save('Beispiel.xlsx')` eine neue Datei erstellen. Dazu musst Du ja erst einmal `excelDatei` haben. Und wenn Du das *neu* erstellen willst, brauchst Du `Workbook`. Versuch doch die nächste Zeile im Tutorial nach dem Import mal auszuführen. Da gibt's dann einen `NameError` weil `Workbook` nicht bekannt ist:

Code: Alles auswählen

In [8]: # Weg gelassen: from openpyxl import Workbook

In [9]: wb = Workbook()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-9-4a3c36eb9bf9> in <module>()
----> 1 wb = Workbook()

NameError: name 'Workbook' is not defined
Der Import bewirkt das gleich was alle Importe in der Regel bewirken: das das Modul was da importiert wird Code ausführt der den Inhalt des Moduls definiert (beim ersten Import) und das im importierenden Modul, je nach Variante der Importzeile, das importiere Modul oder Inhalte aus dem importierten Modul, an die angegebenen Namen gebunden werden, damit man die dann benutzen kann. Das steht natürlich nicht in der Dokumentation von jeder Bibliothek, sondern in der Python-Dokumentation.