Umgang mit Dateien

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Floydl1
User
Beiträge: 12
Registriert: Montag 12. Februar 2018, 23:51
Wohnort: Wolfenbüttel

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?
Musik beflügelt das Leben!
Benutzeravatar
pixewakb
User
Beiträge: 1409
Registriert: Sonntag 24. April 2011, 19:43

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Floydl1
User
Beiträge: 12
Registriert: Montag 12. Februar 2018, 23:51
Wohnort: Wolfenbüttel

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".
Musik beflügelt das Leben!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Floydl1
User
Beiträge: 12
Registriert: Montag 12. Februar 2018, 23:51
Wohnort: Wolfenbüttel

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!
Musik beflügelt das Leben!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten