Seite 1 von 1

Anfängerfrage zu python/Excel

Verfasst: Freitag 7. August 2020, 10:42
von maowmaow
Hallo,

ich bin noch total grün hinter den ohren, habe vom Programmieren kaum Ahnung.

Was möchte ich erreichen:

Gegeben sei eine Excel-Datei .xlsx (in meinem Fall nun test.xlsx mit Einträgen in den ersten 4 Spalten und Zeilen (Zahlen die als "Standard" in Excel deklariert werden). Es soll in einer Spalte (bzw. einer Reihe) die Elemente die da drinnen sind ausgegeben werden.

Bonus (also das möchte ich später damit anfangen): Diese Werte sollen jeweils (!) in eine neue Exceldatei in eine bestimmte Zelle eingegeben werden.


Da ich absolut keinen Plan vom Programmieren habe, habe ich also zunächst erstmal gegoogelt und kam schnell auf irgendwelche Freds wo ich den größten Teil nicht verstanden habe. Ob das nun richtig ist, was ich da veranstalte stell ich mal bei Seite. Natürlich möchte ich dazu lernen und hab mir dazu auch vorgestellt nebst Online-Kurse zu machen; jedes alles peu a peu und alles zu seiner Zeit :); hier erstmal mein bisheriger Ansatz - ab welchem ich nicht mehr weiterkomme und wohl weil das Quatsch ist was da steht entsprechende Fehlermelduungen bekomme.

Code: Alles auswählen

ffrom openpyxl import load_workbook
wb = load_workbook("test.xlsx")
ws = wb['Tabelle1']

#cell_value= ws.cell(2,3).value # 
cell_A= ws['A:A'] # 
#print(cell_value,'(',type(cell_value),')')
length_cell=len(cell_A)

print("Länge der Spalte: ", str(length_cell),"Elemente")
for i in range(0,length_cell,1):
    n=ws.cell[i].value
    print(n)

print(cell_A[0])
runfile('C:/Users/ttttx/Desktop/Python Projekt 1/readwrite.py', wdir='C:/Users/frank/Desktop/Python Projekt 1')
Länge der Spalte: 4 Elemente
Traceback (most recent call last):

File "C:\Users\ttttx\Desktop\Python Projekt 1\readwrite.py", line 19, in <module>
n=ws.cell.value

TypeError: 'method' object is not subscriptable
Fehlerausgabe:

mögliche Lösung dachte ich:

Code: Alles auswählen

for i in range(0,length_cell,1):
    n=ws.cell['A'i,'A'i].value
    print(n)
... liefert aber nen Synnthaxfehler.

Btw: Was ich mich natürlich auch frage ist, wie man überhaupt darauf kommt da dieses openpyxl zu lasen und was man davon wiederum genau braucht. Macht ihr euch bei diversen Problemen dann einfach immer im Forum schlau oder gibt es gewisse Grundbausteine, also z.b. dieses openpycl oder numpy und da wiederum einige dieser "Submodule (?)" die man einfach kennen muss o.a. ?

Re: Anfängerfrage zu python/Excel

Verfasst: Freitag 7. August 2020, 11:15
von maowmaow
Hab es gelöst :)

Code: Alles auswählen

            
from openpyxl import load_workbook
wb = load_workbook("test.xlsx")
ws = wb['Tabelle1']

A=len(ws['A:A'])
for i in range(0,A,1):
    r=(i+1)
    cell_value=ws.cell(r,1).value
    print(cell_value)
    
Wär natürlich jetzt noch gut zu verstehen was an meinen vorherigen Ansätzen nicht so ganz korrekt war ^^.. nujaa.. kommt Zeit kommt Rat :)

Re: Anfängerfrage zu python/Excel

Verfasst: Freitag 7. August 2020, 11:45
von __blackjack__
@maowmaow: `Worksheet.cell` ist halt nix wo man was mit eckigen Klammern machen kann, denn das ist wie die Fehlermeldung ja sagt eine Methode. Und was soll bei einer Methode ein Zugriff mit eckigen Klammern denn bedeuten? Methoden kann man aufrufen. Und was diese konkrete Methode da an Argumenten erwartet und als Ergebnis liefert, steht in der `openpyxl`-Dokumentation. Wobei Du selbst ja schon die richtige Verwendung auskommentiert in Deinem Quelltext stehen hast.

Das Ergebnis des „cell range“ "A:A" an den Namen `cell_A` zu binden ist falsch. Das ist ja keine Zelle, das sind alle Zellen in der Spalte, also `column_A`.

Wenn man die ersten 4×4 Zellen haben will, dann kann man das auch gleich als „cell range“ angeben:

Code: Alles auswählen

In [121]: sheet["A1:D4"]                                                        
Out[121]: 
((<Cell 'Tabelle1'.A1>,
  <Cell 'Tabelle1'.B1>,
  <Cell 'Tabelle1'.C1>,
  <Cell 'Tabelle1'.D1>),
 (<Cell 'Tabelle1'.A2>,
  <Cell 'Tabelle1'.B2>,
  <Cell 'Tabelle1'.C2>,
  <Cell 'Tabelle1'.D2>),
 (<Cell 'Tabelle1'.A3>,
  <Cell 'Tabelle1'.B3>,
  <Cell 'Tabelle1'.C3>,
  <Cell 'Tabelle1'.D3>),
 (<Cell 'Tabelle1'.A4>,
  <Cell 'Tabelle1'.B4>,
  <Cell 'Tabelle1'.C4>,
  <Cell 'Tabelle1'.D4>))

Re: Anfängerfrage zu python/Excel

Verfasst: Freitag 7. August 2020, 12:03
von maowmaow
Huhu und danke dir für die Antwort. Mein letzter Code macht genau das was ich eigentlich wollte. Also Ziel war es schon mir die Werte ausgeben zu lassen. Jetzt möchte ich das weiterschreiben und gerne das Ergebnis auch so in einer neuen Exceldatei abspeichern. habe dazu herausgefunden, dass ich wb.save("name.xlsx") verwenden kann und habe den Code entsprechend erweitert:

Code: Alles auswählen

from openpyxl import load_workbook
from openpyxl import Workbook
wb = load_workbook("test.xlsx")
ws = wb['Tabelle1']

A=len(ws['A:A'])
for i in range(0,A,1):
    r=(i+1)
    cell_value=ws.cell(r,1).value
    print(cell_value)

wb_neu = Workbook()
ws_neu = wb_neu.active
ws_neu.title = "Erstes Blatt"
ws1_neu = wb_neu.create_sheet("Zweites Blatt")
wb_neu.save('balances.xlsx')

Die Datei balances.xlsx wird nun geschrieben, ist aber leer. Also muss ich schauen, dass ich die Werte die der da bekommt auch genau da rein packt wie ich das möchte. Gibts dazu ein kleines How to wie ich das bewerkstelligen kann? Auch weiß ich nicht genau wo ich den code für die neue Datei eigentlich hinpacken sollte (Anfang oder Ende des gesamten Codes? ) Ich vermute ja mal, dass man in python so schreibt, dass man eines nach dem anderen macht, also kein Kuddelmuddel da rein bekommt und Deklarationen/Variablen und das Werkzeug (import etc.) ganz and en Anfang stellt?! So dachte ich mir vom Programmaufbau also: Werkzeuge / Leseteil / Erstellung neuer Datei / Gelesene Parameter reinschreiben /Neue Datei speichern ?

Danke :)

Re: Anfängerfrage zu python/Excel

Verfasst: Freitag 7. August 2020, 12:47
von __blackjack__
@maowmaow: Du solltest Dir am besten gar nicht erst angewöhnen Namen mit kryptischen Abkürzungen zu schreiben oder gar welche die nur aus einer kryptischen Abkürzung bestehen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Du lässt Dir alle Zellen der Spalte "A" geben, ermittelst davon die Länge, und schmeisst die Zellobjekte dann wieder weg. Um dann in der Schleife noch mal jedes einzelne Zellobjekt vom Arbeitsblatt abzufragen. Die hattest Du ja schon mal alle.

Das mit dem Titel funktioniert an sich schon, aber Du setzt den halt auf dem aktiven Arbeitsblatt der eingelesenen Datei und nicht auf einem Arbeitsblatt in der *neuen* Datei. `ws_neu` stimmt da als Name dann auch nicht, denn das ist ja kein neues Arbeitsblatt. Sollte es aber vielleicht sein.

Und auch das neu erstellte Arbeitsblatt `ws1_neu` erzeugst Du im alten Dokument, nicht im Neuen. Der Name ist auch sehr schlecht. Was soll die 1 bedeuten? Wähle Namen so, dass der Leser die Bedeutung von den Werten daran ablesen kann. Denn *das* will man als Leser ja wissen, was die Dinge/Werte bedeuten, nicht das wievielte Ding das ist.

Code: Alles auswählen

#!/usr/bin/env python3
from openpyxl import Workbook, load_workbook


def main():
    workbook = load_workbook("test.xlsx")
    sheet = workbook["Tabelle1"]

    for cell in sheet["A:A"]:
        print(cell.value)

    new_workbook = Workbook()
    new_sheet = new_workbook.active
    new_sheet.title = "New Title"
    new_sheet["D4"] = sheet["A3"].value
    new_workbook.save("balances.xlsx")


if __name__ == "__main__":
    main()

Re: Anfängerfrage zu python/Excel

Verfasst: Freitag 7. August 2020, 12:58
von maowmaow
__blackjack__ hat geschrieben: Freitag 7. August 2020, 12:47 @maowmaow: Du solltest Dir am besten gar nicht erst angewöhnen Namen mit kryptischen Abkürzungen zu schreiben oder gar welche die nur aus einer kryptischen Abkürzung bestehen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Du lässt Dir alle Zellen der Spalte "A" geben, ermittelst davon die Länge, und schmeisst die Zellobjekte dann wieder weg. Um dann in der Schleife noch mal jedes einzelne Zellobjekt vom Arbeitsblatt abzufragen. Die hattest Du ja schon mal alle.

Das mit dem Titel funktioniert an sich schon, aber Du setzt den halt auf dem aktiven Arbeitsblatt der eingelesenen Datei und nicht auf einem Arbeitsblatt in der *neuen* Datei. `ws_neu` stimmt da als Name dann auch nicht, denn das ist ja kein neues Arbeitsblatt. Sollte es aber vielleicht sein.

Und auch das neu erstellte Arbeitsblatt `ws1_neu` erzeugst Du im alten Dokument, nicht im Neuen. Der Name ist auch sehr schlecht. Was soll die 1 bedeuten? Wähle Namen so, dass der Leser die Bedeutung von den Werten daran ablesen kann. Denn *das* will man als Leser ja wissen, was die Dinge/Werte bedeuten, nicht das wievielte Ding das ist.

Code: Alles auswählen

#!/usr/bin/env python3
from openpyxl import Workbook, load_workbook


def main():
    workbook = load_workbook("test.xlsx")
    sheet = workbook["Tabelle1"]

    for cell in sheet["A:A"]:
        print(cell.value)

    new_workbook = Workbook()
    new_sheet = new_workbook.active
    new_sheet.title = "New Title"
    new_sheet["D4"] = sheet["A3"].value
    new_workbook.save("balances.xlsx")


if __name__ == "__main__":
    main()
Danke dir für die Antwort. Naja aller Anfang ist schwer :) Ich muss mich da mal reinfuchsen was du da genau geschrieben hast, aber verstehe gerade erstmal das mit dem def main() und if__name__ sowie main() etc. leider nicht. Ist das ein Standardprozedere? Kann man das explizit wo nachlesen was du da genau gemacht hast? Ich meine nämlich sowas habe ich schonmal gelesen.

Re: Anfängerfrage zu python/Excel

Verfasst: Freitag 7. August 2020, 13:06
von __blackjack__
@maowmaow: `__main__` steht in der Python-Dokumentation: https://docs.python.org/3.6/library/__main__.html

Man möchte in der Regel nicht das Code mit Seiteneffekten ausgeführt wird wenn man ein Modul nur importiert. Es gibt Module und Werkzeuge die erwarten das man ein Modul problemlos nur importieren kann, so dass danach der Modulinhalt definiert ist, aber sonst nichts weiter passiert.

Du musst übrigens nicht den gesamten Beitrag zitieren. Der steht ja direkt da drüber.