Seite 1 von 1

Bereich aus einer Textdatei extrahieren

Verfasst: Mittwoch 1. Juli 2015, 09:44
von pipesmoker
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

Re: Bereich aus einer Textdatei extrahieren

Verfasst: Mittwoch 1. Juli 2015, 09:59
von kbr
@pipesmoker: Deine Beschreibung weist auf eine xml-artige Struktur hin. Dafür gibt es Module in der Standard-Library als auch extern lxml.

Re: Bereich aus einer Textdatei extrahieren

Verfasst: Mittwoch 1. Juli 2015, 10:17
von Sirius3
@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')

Re: Bereich aus einer Textdatei extrahieren

Verfasst: Mittwoch 1. Juli 2015, 10:32
von MagBen
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

Re: Bereich aus einer Textdatei extrahieren

Verfasst: Mittwoch 1. Juli 2015, 18:33
von pipesmoker
@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

Re: Bereich aus einer Textdatei extrahieren

Verfasst: Mittwoch 1. Juli 2015, 18:43
von Sirius3
@pipesmoker: woher kommen denn die Daten und wie sehen sie denn nun genau aus?