2014-03-07 5 views
5

Ich arbeite an einem excel workbook. Ich benutze python Skript für den Betrieb an der workbook. Aber es gibt zwei Probleme:

1) Es gibt einige Zellen, die integer Werte haben. Wenn ich diese Werte lese und den gelesenen Wert in eine Berichtsdatei (.txt) lege, fügt sie .0 mit der Nummer hinzu. Z.B. Wenn es Wert 6 gibt, gibt es 6,0, wenn es das nicht tun soll. Ich habe gelesen, dass es nichts als integer in Excel gibt. Immer noch habe ich 1000s von Parametern und daher kann ich nicht alle direkt in integer umwandeln mit einigen python Funktion, denn das kann Werte konvertieren, die eigentlich float auch sind.

2) Und wenn ich boolean TRUE und FALSE lese, gibt es mir 1 und 0. Ich möchte was auch immer text Ich sehe in der Excel-Arbeitsmappe auf meinem Desktop. Ich möchte keine Conversions wie diese.

Ich verwende xlrd für excel Operationen in python.
Bitte sagen Sie mir, was ich tun soll, um dieses Problem zu lösen?
Hinweis: Mein Excel-Blatt enthält mehr als 100 Blatt und ich kann nicht „wahr oder falsch“ mit „1 und 0“ etcNicht in der Lage, Daten von Excel zu lesen, wie es auf dem Desktop

+0

Für 1, formatieren Sie Ihre Werte, um die 0 zu verlieren, bevor Sie sie in die Textdatei schreiben. Für 2 ist boolesches Wahr wahrscheinlich 1. Stellen Sie einfach eine Bedingung ein, in der 'if 1 dann true schreibt, andernfalls write False '. – Manhattan

Antwort

1

xlrd Sie alle Ihre Zahlen als Schwimmer schenkt, und Ihre booleans als ganze Zahlen. wie man sie ausdrucken, ist eine reine python Angelegenheit.

Ich nehme an, du weißt es schon h-Zellen enthalten boolesche Werte. (Wenn nicht, überprüfen Sie die Zelle ctype wie im answer von Massimo Fuccillo-- @ Details Johny Kommentar siehe unten gezeigt.) Sie können durch einfaches Drucken bool(var) boolean Zellen als True und False drucken statt var:

>>> var = 1 
>>> print bool(var) 
True 

Beim Schreiben in eine Datei wird dies wie vorgesehen als String 'True' (bzw. 'False') ausgegeben.

Da Excel nicht zwischen Ints und Floats unterscheidet, nehmen wir an, dass Sie unter integer eine Zahl verstehen, deren Bruchteil Null ist. Wenn Python ein Float-Objekt ausgibt, fügt es .0 hinzu, um die Information beizubehalten, dass es sich um ein Float handelt.

Die einfachste Lösung wäre, dies zu unterdrücken, wenn Sie mit „% g“ für die Ausgabe Ihre Zahlen formatieren:

>>> "%g" % 6.0 
'6' 

jedoch "%g" wird standardmäßig auf sechs signifikante Stellen reelle Zahlen abzurunden (obwohl können Sie festlegen, eine andere Präzision).

>>> "%g" % 2500.03 
'2500.03' 
>>> "%g" % 2500.003 
'2500' 

es ist also sicherer, wenn Sie ganzzahlige Werte erkennen sich selbst, und sie entsprechend ausdrucken:

if int(var) == var: 
    print int(var) 
else: 
    print var 

Ich empfehle es auf diese Art und Weise zu tun.

+0

Obwohl Excel nicht zwischen Ganzzahlen und Gleitkommazahlen unterscheidet, ist xlrd intelligent genug, um herauszufinden, ob 1.0 oder 0.0 in Excel als boolescher Wert gemeint ist. Es gibt zwei Möglichkeiten, wie xlrd Ihnen sagt, dass eine Zelle Boolean ist. Einer ist der 'ctype', der von der Antwort von Massimo Fuccillo abgedeckt wird. Die andere Möglichkeit ist, dass xlrd tatsächlich eine ** Python-Ganzzahl ** für Excel-Boolesche Werte zurückgibt, während sie einen ** Python-Gleitkommawert ** für normale Excel-Zahlen zurückgibt. Die zweite Möglichkeit, den Unterschied zu erkennen, besteht darin, 'isinstance()' für den Wert zu verwenden. Aber "ctype" zu überprüfen ist der bevorzugte und selbstdokumentierende Weg. –

+0

Ich habe meine Antwort bearbeitet, um dies zu erwähnen, danke. – alexis

1

für die boolean Frage ändern Sie ctype testen können:

for rx in range(ws.nrows): 
     for cx in range(ws.ncols): 
      print ws.cell(rx,cx).value, ws.cell(rx,cx).ctype 

wenn die Excel-Urzelle ist „TRUE“ FALSCH“der ctype Wert 4

+1

Es kann '4' sein, aber es wäre besser, es mit der' xlrd.XL_CELL_BOOLEAN'-Konstante zu vergleichen, die viel klarer in Bezug auf die Absicht ist ... –

+0

Dies versäumt, eine der Fragen von OP zu adressieren. Wie kann ihm das Überprüfen des CTyps bei der zweiten Ausgabe helfen? Er weiß, dass es bereits boolesch ist, er möchte nur True ausgeben, wenn es True zeigt und andernfalls False ausgibt, anstatt ihrer binären Entsprechung. – Manhattan

+0

von xlrd Dokumentation: XL_CELL_BOOLEAN 1 bedeutet TRUE, 0 bedeutet FALSE. –

Verwandte Themen