Ich verwende openpyxl
, um Werte aus einer Kalkulationstabelle zu lesen. Diese Werte werden als Floats gelesen, ich bin mir nicht ganz sicher warum.Wie float in String ohne Dezimalstellen zu werfen
import openpyxl as opx
wb = opx.load_workbook(SKU_WORKBOOK_PATH, use_iterators=True, data_only=True)
ws = wb.worksheets[0]
for row in ws.iter_rows():
foo = str(int(row[1].internal_value))
Dies wirft den Fehler:
ValueError: invalid literal for int() with base 10: '6978279.0'
Normalerweise openpyxl liest in Integer-Werte als int
, aber diesmal hat es in einem Schwimmer Guss als String lesen. In der Tabelle ist der Wert dieser Zelle 6978279
.
Ich konvertiere dies zu der Zeichenfolge, die ich mit foo = str(int(float(foo)))
wollen, die in '6978279'
wie beabsichtigt resultiert. Ich könnte auch tun foo = foo[:-2]
, aber das macht mir Sorgen, dass eine andere Zelle, die als int
oder mit mehr Nachkommastellen gelesen werden kann, Dinge vermasseln würde.
Das fühlt sich an wie eine schreckliche, unordentliche Art und Weise zu paspeln, was ich habe in was ich will. Gibt es einen mehr pythischen Weg, dies zu tun? Lese ich die xlsx
in einer Weise, die Kräfte schwimmt? Wie kann ich das ohne Triple Casting machen?
Es wird ein Suchbegriff in einem Web-Scraper verwendet, also muss es eine Zeichenfolge sein (an dieser Stelle im Skript sowieso). Aber die '.0' bewirkt, dass die Suche fehlschlägt. Ich könnte es einfach in "float" konvertieren, wenn ich es einlese, in "int", wenn ich es mit seinen anderen Suchbegriffen assoziiere, und dann in "str", wenn ich es suche. Ich habe mich nur gewundert, dass es einen Weg gibt, alle drei auf einmal ohne diese klobige Kombination von Casts zu machen. – Will
Beim Lesen von Excel-Dateien versucht openpyxl, in int zu konvertieren und fällt dann wieder auf float für alles in der XML-Quelle, die einen Dezimalpunkt hat. Sie können leicht von einem Float in einen Int konvertieren. Sie verwenden auch eine ältere Version der API und sollten 'internal_value' vermeiden. –