Python: xml/xlsx parser
Tanja
- programmiertechnik
Guten Morgen,
seit längerem nutze ich das xlsx2csv.py Script zum Konvertieren verschiedener Exports.
Leider haben einige "Datenlieferanten" neuerdings in ihrer xlsx Datei eine leere Zeile. Die Datei ist valide, aber eben mit dem "Bug", dass Zeile 1 leer ist und die Reihenbeschriftung in Zeile 2 zu finden ist.
An sich kein Problem, aber scheinbar sieht Python das anders:
...
self.colNum = cellId[:len(cellId)-len(self.rowNum)]
=> TypeError: object of type 'NoneType' has no len()
Habt ihr einen Tipp, wie sich das umgehen lässt?
Einiges habe ich bereits versucht, jedoch immer nur mit dem Ergebnis, dass zwar der Fehler nicht mehr angezeigt wird, aber die Inhalte der darunterliegenden Reihen nicht vollständig geladen werden :-(
def handleStartElement(self, name, attrs):
##self.colType!="NoneType" fuehrt dazu, dass auch darunterliegende Inhalte fehlen
if self.in_row and name == 'c' and self.colType!="NoneType":
self.colType = attrs.get("t")
self.s_attr = attrs.get("s")
cellId = attrs.get("r")
##dasselbe passiert damit
# try:
# self.colNum = cellId[:len(cellId)-len(self.rowNum)]
# except (TypeError):
# self.colNum = self.colNum
self.colNum = cellId[:len(cellId)-len(self.rowNum)]
#self.formula = None
self.data = ""
self.in_cell = True
elif self.in_cell and name == 'v':
self.in_cell_value = True
elif self.in_sheet and name == 'row' and attrs.has_key('r'):
self.rowNum = attrs['r']
self.in_row = True
self.columns = {}
self.spans = None
if attrs.has_key('spans'):
self.spans = [int(i) for i in attrs['spans'].split(":")]
elif name == 'sheetData':
self.in_sheet = True
Großes Dankeschön
Tach!
Leider haben einige "Datenlieferanten" neuerdings in ihrer xlsx Datei eine leere Zeile. Die Datei ist valide, aber eben mit dem "Bug", dass Zeile 1 leer ist und die Reihenbeschriftung in Zeile 2 zu finden ist.
Habt ihr einen Tipp, wie sich das umgehen lässt?
Die einfachste Vermutung ist, dass das Problem sich mit einem Trim oder wenigstens LTrim lösen lässt.
dedlfix.
Hallo dedlfix,
nach einer geeigneten Stelle, wo sich der Dateiinhalt trimmen lässt, habe ich vergeblich gesucht: https://github.com/dilshod/xlsx2csv/blob/master/xlsx2csv.py
Tanja
Tach!
nach einer geeigneten Stelle, wo sich der Dateiinhalt trimmen lässt, habe ich vergeblich gesucht: https://github.com/dilshod/xlsx2csv/blob/master/xlsx2csv.py
Da gibt es einen Parameter skip_empty_lines, sorgt der eventuell für die gesuchte Funktionalität? Ansonsten, denke ich, sieht Zeile 122 erfolgversprechend aus:
instance.parse(ziphandle.read(filename))
Mir scheint, dass am Ergebnis von ziphandle.read(filename) das Trim ansetzen müsste, bevor es zum Parsen geht.
dedlfix.