Openpyxl: Manipulation der Zelle Werte
Ich versuche, die pull-Werte von Zellen aus einem excel-sheet, tun Mathe mit Ihnen, und schreiben die Ausgabe in einem neuen Blatt. Ich erhalte eine ErrorType. Ich habe den code erfolgreich vor, sondern nur zugegeben, dieser Aspekt, also der code wurde destilliert unter:
import openpyxl
#set up ws from file, and ws_out write to new file
def get_data():
first = 0
second = 0
for x in range (1, 1000):
if ws.cell(row=x, column=1).value == 'string':
for y in range (1, 10): #Only need next ten rows after 'string'
ws_out.cell(row=y, column=1).value = ws.cell(row=x+y, column=1).value
second = first #displaces first -> second
first = ws.cell(row=x+y, column=1).value/100 #new value for first
difference = first - second
ws_out.cell(row=x+y+1, column=1).value = difference #add to output
break
Einen TypeError message:
erste = ws.Zelle(Zeile=x+y, Spalte=1).Wert)/100
TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'
Ich nehme an, das bezieht sich auf die ws.Zelle Wert und 100, bzw. so habe ich es auch versucht:
first = int(ws.cell(row=x, column=1))/100 #also tried with float
Wirft:
TypeError: int() argument muss eine Zeichenkette oder eine Zahl
Habe ich bestätigt, dass jede Zelle in der Spalte aus, die nur aus zahlen. Darüber hinaus openpyxl Zelle.data_type gibt 'n' (vermutlich für die Anzahl so weit wie ich kann sagen, durch die Dokumentation).
Habe ich auch getestet, mehr einfache Mathematik, und habe den gleichen Fehler.
Alle meine Suche scheint zu openpyxl normal zu Verhalten wie diese. Mache ich etwas falsch, oder ist das einfach eine Einschränkung des Moduls? Wenn ja, gibt es irgendwelche programmatischen workarounds?
Als bonus, Tipps zum schreiben von code prägnanter wäre sehr geschätzt werden. Ich bin erst am Anfang, und das Gefühl, es muss ein sauberer Weg zu schreiben, oder Ideen wie diese.
Python 3.3, openpyxl-1.6.2, Windows 7
Zusammenfassung
cfi ' s Antwort hat mir geholfen es herauszufinden, obwohl ich eine etwas andere Problemumgehung. Für die überprüfung der ursprünglichen Datei, es war eine leere Zelle (die hatte ich vorher übersehen hatten). Da ich neu mit diesem code später auf Spalten mit mehr sporadisch leere Zellen, die ich verwendet habe:
if ws.cell(row=x+r, column=40).data_type == 'n':
second = first #displaces first -> second
first = ws.cell(row=x+y, column=1).value/100 #new value for first
difference = first - second
ws_out.cell(row=x+y+1, column=1).value = difference #add to output
So, wenn eine bestimmte Zelle leer war, wurde es ignoriert und übersprungen.
- Bitte immer nach dem code entspricht, den zitierten Fehler.
row=x+r
bezieht sich auf eine variabler
, die nicht vorhanden ist in deinem code. - Vielen Dank, aktualisiert die Fehlermeldung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie 100% sicher (=verifiziert), dass alle Zellen, auf die Sie zugreifen tatsächlich einen Wert? (Edit: Mache einen
print("dbg> cell value of {}, {} is {}".format(row, 1, ws.cell(row=row, column=1).value))
um zu überprüfen, Inhalte)Statt durch eine Feste range(1,1000), würde ich empfehlen, um zu verwenden openpyxl Introspektion-Methoden zur Iteration über die vorhandenen Zeilen. E. g.:
Bekommen, wenn die Werte nicht vergessen, um zu extrahieren die
.value
Attribut:Als allgemeiner Hinweis:
x
, undy
nützlich sind Variablen Namen für die 2D-Koordinaten. Verwenden Sie Sie nicht sowohl für die Zeilen. Es wird irreführen anderen, die haben, den code zu Lesen. Stattx
könnten Siestart_row
oderrow_offset
oder etwas ähnliches. Statty
Sie konnte einfachrow
und Sie könnten, lassen Sie es starten mit dem ersten index wird diestart_row+1
.Einige Beispiel code (ungetestet):
Nun mit diesem code habe ich immer noch nicht verstehen, was Sie versuchen zu erreichen. Ist die
break
richtig eingezogen? Wenn ja, ist das erste mal, wenn Sie passend sindstring
die äußere Schleife wird verlassen, indem derbreak
. Dann, was ist der Punkt der Variablenfirst
undsecond
?Edit: Auch sicherzustellen, dass Ihre Lektüre von und schreiben in
cell().value
nicht nurcell()
.break
ist richtig eingezogen, da bin ich nur auf der Suche für die erste Instanz vonstring
Einleitung der nächstenif
- Anweisung.First
undSecond
Blick auf die anderen Variablen mit einem bestimmten Bezug zustring
und subtrahieren Sie voneinander. (Speziell, Sie sind Zeit-Punkte: Zeit 2 subtrahiert von Zeit 1 für eine Differenz, die mit der Zeit 1 immer der Wert für die Zeitzone 2 für die nächste Zeile. Zeit, die zum berechnen einer Geschwindigkeitstring
.) Ich mag deine Idee der Umbenennung einige der Variablen, die ich tun werde. Vielen Dankprint()
Werte, bevor Sie für die Berechnung, um zu überprüfen, Inhalte. Zweitens stellen Sie wrinte incell.value
, nicht nurcell
. Bearbeitet mein code-Beispiel entsprechend. - Ah ich sehe gerade, die Sie bearbeitet haben deine Frage schon..