Bereich aus einer Textdatei extrahieren

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.
Antworten
pipesmoker
User
Beiträge: 2
Registriert: Mittwoch 1. Juli 2015, 09:21

Hallo,

bisher konnte ich kleine Aufgaben immer ganz gut mit python loesen, aber momentan habe ich ein kleines Problem.
Ich muss eine Datei mit Messdaten einlesen und einige Werte extrahieren. Die Datei ist so aehnlich wie html aufgebaut, also start- und stop-tag.

Die Datei sieht so aus:

<header>Daten zur Messung</header>
<device>Bezeichnung des Messgeraetes</device>
<content_1>
Messdaten
Messdaten
.
.
.
</content_1>

Da viele Messungen in einer Datei stehen, ist diese sehr lang (>10000 Zeilen), ich moechte aber immer nur eine bestimmte Messung in eine Datei extrahieren:
Bezeichnung Messgeraet
Messdaten
Messadten
Ende


Meine bisherige Teilloesung ist die:

Code: Alles auswählen

    temp=('/tmp/test%i' %(a))
    open(temp, "wb").write(source)
    out=('out%i' %(a))
    for line in open(temp,'r'):
        if 'device' in line:
            print line.split('"')[3] #zur Kontrolle
            geraet = line.split('"')[3]
            
            inhalt.append(topic)
            inhalt.append('\n')

        if 'content_1' in line:
Ich hole mir die Messdaten vom server, speichere sie in einem temp-file und zerpfluecke dann das temp-file. Mein Problem ist nun folgendes:
wie kann ich python sagen
beginne nach <content_1> mit dem Extrahieren und ende vor </content_1> ???
Manchmal sind es 200 Zeilen mit Messwerten, manchmal 1037. Wie kann man das loesen?

Vielen Dank im Voraus,
pipesmoker
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@pipesmoker: Deine Beschreibung weist auf eine xml-artige Struktur hin. Dafür gibt es Module in der Standard-Library als auch extern lxml.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@pipesmoker: um XML-Dateien zu lesen gibt es xml.etree.ElementTree. Welchen Zweck hat das Zwischenspeichern auf /tmp? Gerade Dateien, die man schreibt sollten zeitnah wieder geschlossen werden. Du verwendest unübersichtlich viele unnötige Klammern bei Deinen Strings.
In Deinem Beispiel fehlt das root-Tag. Existiert das wirklich nicht, oder hast Du es nur nicht mitkopiert?

So sähe das aus:

Code: Alles auswählen

import xml.etree.ElementTree as ET

root = ET.fromstring(source)
header = root.findtext('header')
device = root.findtext('device')
content = root.findtext('content_1')
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

pipesmoker hat geschrieben:Da viele Messungen in einer Datei stehen, ist diese sehr lang (>10000 Zeilen)
Ein paar MB ist keine problematische Dateigröße, da würde ich die Datei komplett reinladen.

Code: Alles auswählen

lines = open(temp, "r").readlines() # Datei komplett reinladen
lines = [l.strip() for l in lines] # Leerzeichen und \n entfernen

i1 = lines.index("<content_1>")
i2 = lines.index("</content_1>")
print i1, i2

# alle Zeilen von einschliesslich (i1+1) bis ausschliesslich i2
content_1_lines = lines[i1+1:i2] 
print content_1_lines
Sofern "<content_1>" mehrmals in der Datei vorkommt, gibt Dir index() den ersten Index. Den nächsten "<content_1>" Index kannst Du bekommen, indem Du i2 als Startwert für die Suche nimmst.

Fehlerbehandlung ist auch schon eingebaut, wenn "<content_1>" oder "</content_1>" nicht gefunden wird, bekommst Du die folgende Meldung:
ValueError: '<content_1>' is not in list
a fool with a tool is still a fool, www.magben.de, YouTube
pipesmoker
User
Beiträge: 2
Registriert: Mittwoch 1. Juli 2015, 09:21

@Sirius3
danke, aber da funktioniert etwas nicht:

Code: Alles auswählen

    root = ET.fromstring(temp)
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1300, in XML
    parser.feed(text)
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1642, in feed
    self._raiseerror(v)
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror
    raise err
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0

@MagBen
Super, das habe ich gesucht! Vielen Dank :)

Gruss,
pipesmoker
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@pipesmoker: woher kommen denn die Daten und wie sehen sie denn nun genau aus?
Antworten