Mehrzeilige und mehrspaltige Tabelle

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.
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Hallo Leute,ich habe folgendes Problem:
ich muss aus Excel die Daten aus einer zweidimensionalen Tabelle importieren.Und zwar sieht die Tabelle so aus:

Code: Alles auswählen

Width                             	VdotAir										
Height	0	0,1	0,2	0,3	0,4	0,5	0,6	0,7	0,8	0,9	1
0						0,3					
0,1			0,3	0,3	0,3	0,22 	0,3	 0,3	 0,3		
0,2		0,3	0,3	0,22	0,22	0,18	0,22	0,22	0,3	0,3	
0,3		0,3	0,22	0,18	0,18	0,14	0,18	0,18	0,22	0,3	
0,4		0,3	0,22	0,18	0,18	0,1	0,18	0,18	0,22	0,3	
0,5	0,3	0,22	0,18	0,14	0,14	0	0,14	0,14	0,18	0,22	0,3
0,6		0,3	0,22	0,18	0,18	0,1	0,18	0,18	0,22	0,3	
0,7		0,3	0,22	0,18	0,18	0,14	0,18	0,18	0,22	0,3	
0,8		0,3	0,3	0,22	0,22	0,18	0,22	0,22	0,3	0,3	
0,9			0,3	0,3	0,3	0,22	0,3	0,3	0,3		
1						0,3					
Wie man sieht, ich habe VdotAir,das sowohl von Width als auch von Height abhängig ist.Width und Height habe ich schon in Python importiert.Wie importiere ich VdotAir? mein Python-Code sieht so aus:

Code: Alles auswählen

   def readVdotAir(self, fileName):
        sh = self._getWorkBook(fileName)
        col = self._getPropertyRow('Width', sh)
        row = self._getPropertyLine('Height', sh)
        self.cellwidth = array([x for x in sh.col_values(col)[2:13] if x != ''])
        self.cellheight =array([x for x in sh.row_values(row)[1:12] if x != '' ])
Die Funktionen self._getWorkBook,self._getPropertyRow und self._getPropertyLine habe ich im Voraus definiert.Wie man sieht self.cellwidth und self.cellheight sind auch als Felder definiert.Es klappt auch sie abzulesen.Aber wie lese ich VdotAir,das von beiden werten abhängig ist?
Vielen Dank für die Hilfe.Entschuldigung für die undeutliche Tabelle,nur ich habe leider kein xls.-Format gefunden.
Zuletzt geändert von cofi am Freitag 8. August 2014, 14:10, insgesamt 1-mal geändert.
Grund: Tabelle und Code markup korrigiert
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@anika_20: Die Funktionen _getWorkBook, _getPropertyRow und _getPropertyLine scheinen nicht wirklich Klassenmethoden zu sein. Unter cellwidth und cellheight verstehe ich was anderes.
Fehlen da wirklich bestimmte width/height-Kombinationen in der Matrix?

Du liest ja schon ganze Spalten und Zeilen ein. Wo ist dann das Problem das selbe für eine Matrix zu tun?
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Guten Morgen,
genau das Ablesen von Matrix aus Excel-Datei ist mein Problem.Ich habe das Programm erweitert,und es sieht mittlerweile so aus:

Code: Alles auswählen

    def readVdotAir(self, fileName):
        sh = self._getWorkBook(fileName)
        col = self._getPropertyRow('Width', sh)
        row = self._getPropertyLine('Height', sh)
        col1 = self._getPropertyRow('VdotAir', sh)
        row1 = self._getPropertyLine('VdotAir',sh)
        
        self.cellwidth = array([x for x in sh.col_values(col)[2:13] if x != ''])
        self.cellheight =array([x for x in sh.row_values(row)[2:13] if x != '' ])
        self.VdotAir =array([[x for x in sh.row_values(col1)[2:13] if x != ''],\
        [x for x in sh.col_values(row1)[2:13] if x != '']])
Er schmeißt mir Fehler raus:

Code: Alles auswählen

 if prop in elem:
TypeError: argument of type 'float' is not iterable
Die Funktion bei der er Fehler zeigt sieht so aus:

Code: Alles auswählen

    def _getPropertyLine(self, prop, sh):
        # look for line number containing prop
        for i, elem in enumerate(sh.col_values(0)):
            if prop in elem:
                row = i
                break
        #
        return row
Ich verstehe nicht, vielleicht habe ich Matrix falsch definiert?
Danke für die Hilfe
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@anika_20: Du solltest den ganzen Stacktrace posten. Dann könnte man auch ablesen, dass der Fehler in der Zeile mit `row1 = ...` auftritt, also lange bevor Du was mit der Matrix versuchst. Hast Du verstanden was die Methoden _getPropertyRow und _getPropertyLine zu tun versuchen und was sie tatsächlich tun? So wie die Funktionen geschrieben sind, funktionieren sie nur bei exakt diesem Aufbau der Excel-Datei und wenn die Datei immer exakt so aufgebaut ist, dann braucht man diese Funktionen eigentlich nicht. Zudem macht es keinen Sinn, dass sie in einer Klasse stecken, da sie `self` auch kein einziges Mal benutzen.
Die List-Comprehensions sind in diesem Fall auch völlig sinnfrei, weil, falls es Lücken in den Zahlenreihen gäbe, würde mit großer Wahrscheinlichkeit sowieso nur Zahlensalat entstehen, da will man lieber mit einem Fehler abbrechen.

Zum Problem: Du kennst doch die genauen Zellenpositionen der Matrix und anscheinend auch deren Größe. Also kannst Du per List-Comprehension, alle relevanten Zeilen durchgehen und per `sh.col_values` die Werte aus dem Excel lesen.

PS: Und nicht einfach leer Zellen wegschmeißen sondern durch einen passenden Wert (bzw. Nicht-Wert [NaN]) ersetzen.
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Vielen Dank für die Antwort. Ich habe einiges geändert und mein Code sieht momentan so aus:

Code: Alles auswählen

    def readVdotAir(self, fileName):
        sh = self._getWorkBook(fileName)
        col = self._getPropertyRow('Width', sh)
        row = self._getPropertyLine('Height', sh)
        col1 = self._getPropertyRow('VdotAir', sh)
        row1 = self._getPropertyLine('VdotAir',sh)
        
        self.cellwidth = array([x for x in sh.col_values(col)[2:13] if x != ''])
        self.cellheight =array([x for x in sh.row_values(row)[2:6] if x != '' ])
        self.VdotAir = matrix ( [[x for x in sh.col_values(col1)[2:13] if x != ''],\
        [x for x in sh.row_values(row1)[2:6] if x != '' ]])
Alle leere Zellen in Excel habe ich mit Null-Werte besetzt.Es gibt momentan kein Fehlermeldung,allerdings zeigt er mir nur die Werte aus der ersten Spalte und ersten Zeile,statt die ganze Matrix zu zeigen.Die Ausgabe sieht so aus:
cellwidth [ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
________________________
cellheight [ 0. 0.1 0.2 0.3]
________________________
VdotAir [[[0.0, 0.0, 0.0, 0.0, 0.0, 0.30000000000000004, 0.0, 0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]]]

Die Werte aus meiner Excel-Tabelle sind:

Code: Alles auswählen

	Width  	VdotAir			
Height		0	0,1	0,2	0,3
VdotAir	0	0	0	0	0
	 0,1	0	0	0,3	0,3
	 0,2	0	0,3	0,3	0,22
	 0,3	0	0,3	0,22	0,18
	 0,4	0	0,3	0,22	0,18
	 0,5	0,3	0,22	0,18	0,14
	 0,6	0	0,3	0,22	0,18
	 0,7	0	0,3	0,22	0,18
	 0,8	0	0,3	0,3	0,22
	 0,9	0	0	0,3	0,3
	 1	0	0	0	0
Mein Ziel ist die Matrixausgabe in Python in Form:

Code: Alles auswählen

	0	0	0	0
	0	0	0,3	0,3
	0	0,3	0,3	0,22
	0	0,3	0,22	0,18
	0	0,3	0,22	0,18
	0,3	0,22	0,18	0,14
	0	0,3	0,22	0,18
	0	0,3	0,22	0,18
	0	0,3	0,3	0,22
	0	0	0,3	0,3
	 1	0	0	0	0
Wie man sieht,gibt er mir nur die Werte aus der ersten Zeile und der ersten Spalte.Wie soll ich das programmieren um das richtige Ergebnis zu bekommen?
Vielen Dank für die Hilfe
Zuletzt geändert von Anonymous am Montag 11. August 2014, 09:41, insgesamt 1-mal geändert.
Grund: Code-Tags gesetzt.
BlackJack

@anika_20: Du musst halt in einer Schleife alle Zeilennummern durchgehen die in dem Array landen sollen und dort jeweils die entsprechenden Zellwerte extrahieren um so eine 2D-Datenstruktur zu erzeugen. Spätestens hier geht das mit dem ignorieren von leeren Zellen nicht mehr, denn so ein Array oder eine Matrix muss ja regelmässig sein, das heisst jede Zeile muss gleich lang sein.

Weitere Anmerkungen: Sirius3 hat's ja schon geschrieben: Das sieht alles nicht danach aus als wenn es in eine Klasse gehört. Das scheinen ganz normale Funktionen zu sein.

`Sheet.col_values()` und `Sheet.row_values()` kann man die Slice-Grenzen schon mitgeben, dann muss man das Ergebnis nicht ”slicen”. Damit erspart man sich das extrahieren von Werten aus Zellen die einen sowieso nicht interessieren.

Einige Namen könnten besser sein. `sh` und nummerierte Namen wie `col` und `col1` machen das Programm nicht verständlicher. `sheet`, `widths_column_index`, `heights_row_index`, `vdot_air_column_index`, und `vdot_air_row_index` sagen wesentlich besser aus was der Wert bedeutet.

Das `_getPropertyRow()` offenbar gar keine Zeilennummer sondern eine Spaltennummer liefert ist auch *sehr* unglücklich.

„Line” heisst Linie oder Zeile im Sinne von Textzeile. Tabellenzeilen heissen im Englischen nicht „line” sondern „row” in sofern ist `_getPropertyLine()` auch ein schlechter Name. *Die* Funktion hätte eigentlich `_getPropertyRow()` heissen müssen.

Edit: Ungetestet:

Code: Alles auswählen

import numpy as np
from xlrd import open_workbook


def read_vdot_air(filename):
    book = open_workbook(filename)
    sheet = book.get_sheet(0)
    
    start_column_index, start_row_index = 2, 2
    data_width, data_height = 4, 11
    end_column_index = start_column_index + data_width
    end_row_index = start_row_index + data_height

    widths = np.array(
        sheet.col_values(start_column_index - 1, start_row_index, end_row_index)
    )
    heights = np.array(
        sheet.row_values(
            start_row_index - 1, start_column_index, end_column_index
        )
    )
    vdot_air = np.matrix(
        [
            sheet.row_values(i, start_column_index, end_column_index)
            for i in xrange(start_row_index, end_row_index)
        ]
    )
    return widths, heights, vdot_air
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Ich habe versucht das Programm laufen zu lassen:

Code: Alles auswählen

import numpy as np
from xlrd import open_workbook

def read_vdot_air(filename):
    book = open_workbook(filename)
    sheet = book.get_sheet(0)
    
    start_column_index, start_row_index = 2, 2
    data_width, data_height = 4, 11
    end_column_index = start_column_index + data_width
    end_row_index = start_row_index + data_height
    
    widths = np.array(sheet.col_values(start_column_index - 1,\
    start_row_index, end_row_index))
    
    heights = np.array(sheet.row_values(start_row_index - 1,\
    start_column_index, end_column_index))
    
    vdot_air = np.matrix([sheet.row_values(i, start_column_index, end_column_index)\
    for i in xrange(start_row_index, end_row_index)])
        
    return widths, heights, vdot_air
    
book = open_workbook('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
print widths
Es kommt folgende Fehlermeldung:

Code: Alles auswählen

>>> runfile('F:/Masterthesis/excel_ablesen.py', wdir=r'F:/Masterthesis')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "F:/Masterthesis/excel_ablesen.py", line 32, in <module>
    print widths
NameError: name 'widths' is not defined
was ist denn falsch?
Zuletzt geändert von Anonymous am Montag 11. August 2014, 11:52, insgesamt 1-mal geändert.
Grund: Code-Tags repariert
BlackJack

@anika_20: Ich würde an der Stelle dringend empfehlen erst einmal Python-Grundlagen zu lernen. Wie kannst Du Klassen schreiben wenn Du noch nicht einmal Funktionen verstanden hast!? Nicht nur das Du anscheinend nicht weisst, das lokale Namen in Funktionen (und Methoden) nur innerhalb der Funktion existieren und nur solange die Funktion ausgeführt wird, erwartest Du hier sogar einen Wert für einen Namen bei dem die Funktion die den lokal beinhaltet noch nicht einmal *aufgerufen* wurde. Das sieht nach Programmieren durch wild herum raten aus. So funktioniert Programmieren aber nicht.

Was falsch ist, sagt die Fehlermeldung übrigens ziemlich deutlich: Der Name `widths` ist nicht definiert.
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Entschuldigung für die Anfängerfragen.Ich habe das zwar schon gelesen,habe aber nochmal nachgelesen.Mittlerweiler ist es mir klar,dass die Funktion aufgerufen werden muss.
ich lese momentan die Grundlagen und versuche mein Problem mit der Matrix zu lösen. So,ich rufe jetzt die Funktion "read_vdot_air" mit der Schnittstelle "filename" auf und möchte "widths, heights,vdot_air" drucken lassen.was soll ich tun?

Code: Alles auswählen

import numpy as np
from xlrd import open_workbook

def read_vdot_air(filename):
    book = open_workbook(filename)
    sheet = book.get_sheet(0)
    
    start_column_index, start_row_index = 2, 2
    data_width, data_height = 4, 11
    end_column_index = start_column_index + data_width
    end_row_index = start_row_index + data_height
    
    widths = np.array(sheet.col_values(start_column_index - 1,\
    start_row_index, end_row_index))
    print widths
    
    heights = np.array(sheet.row_values(start_row_index - 1,\
    start_column_index, end_column_index))
    
    vdot_air = np.matrix([sheet.row_values(i, start_column_index, end_column_index)\
    for i in xrange(start_row_index, end_row_index)])
        
    return widths, heights,vdot_air

read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')

Nochmal,vielen Dank für die Hilfe.
Zuletzt geändert von anika_20 am Montag 11. August 2014, 13:33, insgesamt 3-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Es wäre super, wenn du deinen Code in Code-Tags setzen würdest, dann könnte man ihn auch richtig lesen. Dazu gibt es über dem Textfeld einen Code-Button. Dann ist nicht nur Syntax-Highlighting aktiviert, sondern auch korrekte Einrückung gegeben. Was wür ein Python-Programm natürlich von elementarer Bedeutung ist. Du kannst deine Beiträge auch nachträglich bearbeiten und die Tags hinzufügen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

anika_20 hat geschrieben:

Code: Alles auswählen

[...]
def read_vdot_air(filename):
    [...]
    return widths, heights,vdot_air

read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
Du gibst in der Funktion bei return an, welche Werte zurückgegeben werden sollen. Wenn du diese Werte außerhalb der Funktion brauchst, dann musst du sie auch entsprechend zuweisen.

Code: Alles auswählen

widths, heights, vdot_air = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
Wichtig ist, dass die Namen selber keine Bedeutung haben und nicht zwangsweise so heißen müssen wie innerhalb der Funktion. Folgender Code würde genauso funktionieren, die Werte wären nur an andere Namen gebunden.

Code: Alles auswählen

x, y, z = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
Du könntest die Werte auch komplett in ein Tupel aufnehmen, schließlich gibst du ja auch ein aus drei Werten bestehendes Tupel zurück.

Code: Alles auswählen

result = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
Die einzelnen Werte würdest du dann mit result[0], result[1] und result[2] erreichen. Ich würde aber in diesem Fall ein Tuple-Unpacking mit deskriptiven Namen wie in meinem ersten Beispiel vorziehen.
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Vilen Dank für die Hilfe.Ich bekomme im gleichen Programm folgende Fehlermeldung:

Code: Alles auswählen

>>> runfile('F:/Masterthesis/excel_ablesen.py', wdir=r'F:/Masterthesis')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "F:/Masterthesis/excel_ablesen.py", line 33, in <module>
    w,y,z = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
  File "F:/Masterthesis/excel_ablesen.py", line 14, in read_vdot_air
    sheet = book.get_sheet(0)
  File "C:\Python27\lib\site-packages\xlrd\book.py", line 682, in get_sheet
    raise XLRDError("Can't load sheets after releasing resources.")
xlrd.biffh.XLRDError: Can't load sheets after releasing resources.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Eine einfache Suche nach der Fehlermeldung sagt, und die Dokumentation bestätigt, dass es am get_sheet-Aufruf liegt. Du benutzt eine nicht-dokumentierte Methode. Wie du das Problem löst überlasse ich dir mal als kleine Übung zur Benutzung von Suchmaschinen ;-)
Das Leben ist wie ein Tennisball.
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

Guten Morgen,
das Programm scheint zu funktionieren.Vielen,vielen Dank dafür.Es sieht momentan so aus,dass ich die Finktion "get_sheet" durch von Python vordefinierte Funktion "sheet_by_index" ersetzt habe:

Code: Alles auswählen

import numpy as np
from xlrd import open_workbook


def read_vdot_air(fileName):
    
    book = open_workbook(fileName)
    sheet = book.sheet_by_index(0)
  
       
    start_column_index, start_row_index = 2, 2
    data_width, data_height = 4, 11
    end_column_index = start_column_index + data_width
    end_row_index = start_row_index + data_height
     
    widths = np.array(sheet.col_values(start_column_index - 1, start_row_index,\
    end_row_index))
    heights = np.array(sheet.row_values(start_row_index - 1, start_column_index,\
    end_column_index))
    vdot_air = np.matrix([sheet.row_values(i, start_column_index, end_column_index)
                for i in xrange(start_row_index, end_row_index)])
    return widths, heights, vdot_air

w,y,z = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
print w
print y
print z
Das Ergebnis stimmt auch.
Ich habe aber noch eine Frage,einfach für mich selbst um Python besser zu verstehen.
Wenn ich die Methode "get_sheet" benutze, muss ich sie im voraus definieren.Habe ich gemacht.Es muss dann in die Methode die Funktion "sheet_by_index" rein oder?Wenn ich das so mache,klappt es nicht.Verstehe leider nicht warum.Hier ist mein Programm mit der Funktion "get_sheet":

Code: Alles auswählen

import numpy as np
from xlrd import open_workbook


def get_sheet(fileName):
    book= open_workbook(fileName)
    sheet = book.sheet_by_index(0)        
    return sheet
        

def read_vdot_air(fileName):
    
    book = open_workbook(fileName)
    sheet = book.get_sheet(0)
  
       
    start_column_index, start_row_index = 2, 2
    data_width, data_height = 4, 11
    end_column_index = start_column_index + data_width
    end_row_index = start_row_index + data_height
     
    widths = np.array(sheet.col_values(start_column_index - 1, start_row_index,\
    end_row_index))
    heights = np.array(sheet.row_values(start_row_index - 1, start_column_index,\
    end_column_index))
    vdot_air = np.matrix([sheet.row_values(i, start_column_index, end_column_index)
                for i in xrange(start_row_index, end_row_index)])
    return widths, heights, vdot_air

w,y,z = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
print w
print y
print z
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du musst uns schon den Fehler beschreiben, also entweder durch Posten einer Meldung oder Beschreibung, was passiert und was Du stattdessen erwartet hättest.

In diesem Falle kann ich Dir nur sagen, dass Du Deine selbst geschriebene Funktion *nirgends* aufrufst ;-) (Und ohne Aufruf wird Python natürlich nichts abarbeiten, was da drin passieren soll!)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@anika_20: Die `sheet_by_index()`-Methode ist nicht von Python definiert sondern vom Autor von `xlrd`. Genau wie die `get_sheet()`-Methode auf dem gleichen Datentyp, nur das die nicht öffentlich dokumentiert ist. Ich hatte da die Objekte ”live” angeschaut statt die Dokumentation, und hatte das Beispiel nicht ausprobiert, weil ich zu faul war mir eine Excel-Datei dafür zu erzeugen. ;-)

Dein Problem ist das Du wieder die `get_sheet()`-Methode aufrufst. ``book.get_sheet(0)`` ruft die Methode auf dem `book`-Objekt auf und nicht auf magische Weise Deine Funktion. Und wenn Du dort Deine Funktion aufrufen würdest, dann wäre die Zeile vor dem Aufruf auch unsinnig, denn das `book` welches dort in Zeile 6 definiert wird, wird im weiteren Verlauf dann ja gar nicht verwendet.
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

BlackJack:So, dann in der Funktion "def get_sheet" definiere ich mein Objekt "book",auf dem Basis definiere ich mein "sheet",mit dem ich die Tabellennummer bestimmen kann.
In der nächsten Funktion read_vdot_air wird dann die Funktion "get_sheet" aufgerufen.Ich habe "self" hinzugefügt,da "get_sheet" für "def read_vdot_air" gilt.

Code: Alles auswählen

import numpy as np
from xlrd import open_workbook

def get_sheet(self,fileName):
    book = open_workbook(fileName)
    sheet = book.sheet_by_index(0)        
    return sheet
    
def read_vdot_air(self,fileName):
    
    sheet = self.get_sheet(fileName)
    start_column_index, start_row_index = 2, 2
    data_width, data_height = 4, 11
    end_column_index = start_column_index + data_width
    end_row_index = start_row_index + data_height
     
    widths = np.array(sheet.col_values(start_column_index - 1, start_row_index,\
    end_row_index))
    heights = np.array(sheet.row_values(start_row_index - 1, start_column_index,\
    end_column_index))
    vdot_air = np.matrix([sheet.row_values(i, start_column_index, end_column_index)
                for i in xrange(start_row_index, end_row_index)])
    return widths, heights, vdot_air

w,y,z = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
print w
print y
print z
Fehlermeldung:
runfile('F:/Masterthesis/excel_ablesen.py', wdir=r'F:/Masterthesis')

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "F:/Masterthesis/excel_ablesen.py", line 32, in <module>
    w,y,z = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
TypeError: read_vdot_air() takes exactly 2 arguments (1 given)
BlackJack

@anika_20: `self` ist ein Argumentname wie jeder andere auch. Da muss ein Argument für übergeben werden, wie für jedes andere Argument auch. Bei *Methoden* die in *Klassen* definiert wurden (oder auf andere Wege als Attribute auf das Klassenobjekt gelangen), wird auf dem *Exemplar* das aus so einer Klasse erzeugt wurde, beim Aufrufen automagisch das Exemplar selbst (darum heisst das Argument üblicherweise `self`) als erstes Argument übergeben, gefolgt von den weiteren Argumenten die beim Aufruf übergeben wurden.

Bei einer Funktion macht es deswegen üblicherweise keinen Sinn das erste Argument `self` zu nennen. Deine `read_vdot_air()` erwartet *zwei* Argumente, `self` und `fileName`, und Du rufst die mit *einem* Argument, einer Zeichenkette mit einem Dateinamen auf. Was soll denn da Deiner Meinung nach passieren? Ausser der Fehlermeldung die Du bekommst. Woher soll Python ein Objekt für das `self`-Argument nehmen, und welcher Wert sollte das sein?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was soll denn das "magische" (oder eher unsinnige!) ``self`` als Parameter in den Funktionen‽ Das ist wirklich mehr Raten als alles andere!

``self`` wird bei der Definition von Klassen per *Konvention* als erster Parameter bei *Methoden* benutzt, um das spätere Objekt an die Methode (implizit) zu übergeben. Du arbeitest hier mit *Funktionen*, die vollkommen losgelöst von Klassen funktionieren. Wenn Du denen *zwei* Parameter übergibst - egal, wie die heißen! - musst Du die auch mit zwei Parametern aufrufen. Genau das sagt Dir ja auch der Fehler...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
anika_20
User
Beiträge: 23
Registriert: Donnerstag 5. Juni 2014, 09:21

BlackJack:Vielen Dank,ich habe nochmal versucht und beide Variante funktionieren, egal ob ich "sheet_by_index" direkt in read_vdot_air benutze oder ob ich die Methode def get_sheet selbst definiere.Die letzte Version sieht so aus:

Code: Alles auswählen

import numpy as np
from xlrd import open_workbook

def get_sheet(fileName):
    book = open_workbook(fileName)
    sheet = book.sheet_by_index(0)        
    return sheet
    
def read_vdot_air(fileName):
    
    sheet = get_sheet(fileName)
    start_column_index, start_row_index = 2, 2
    data_width, data_height = 4, 11
    end_column_index = start_column_index + data_width
    end_row_index = start_row_index + data_height
     
    widths = np.array(sheet.col_values(start_column_index - 1, start_row_index,\
    end_row_index))
    heights = np.array(sheet.row_values(start_row_index - 1, start_column_index,\
    end_column_index))
    vdot_air = np.matrix([sheet.row_values(i, start_column_index, end_column_index)
                for i in xrange(start_row_index, end_row_index)])
    return widths, heights, vdot_air

w,y,z = read_vdot_air('F://Masterthesis//ungleichfoermige Anstroemung_air.xls')
print w
print y
print z
Nochmal Danke.
Antworten