Seite 1 von 1

Wertetabelle in Pythonarray bzw. XML Datei schreiben

Verfasst: Donnerstag 9. März 2006, 17:52
von keboo
Hallo Leute!

Ich hätte eine Frage wie ich folgende Wertetabelle aus einem Inputfile in ein Array in Python schreiben um mit den Werten weiterzurechnen bzw. wie ich dieses Wertefeld dann in eine XML Datei bekommen.

< DATA_ >
<LAENGE> <BREITE> <NUM> <VALUE> <DEFINITION>
232.232 19.484 6 88 OK
222.2 22.22 4 33 NIN
2323.22 19.886 6 22 OOS
22.32 19.886 6 23 KKS
2323.12 10.990 5 22 MMM
< _DATA >



Die Daten stehen immer genau untereinander unter den Spaltentiteln, durch Tabs getrennt.
Es können aber unterschiedlich viele Datensätze auftreten.

Wie gesagt meine beiden Fragen wären:

1.) Wie kann ich die Werte in ein Array bringen, damit ich die Werte dann über die Indexe anprechen kann?

2.) Wie kann ich die Datei in eine ungefähr so aussehende XML Datei bringen?

Code: Alles auswählen

<DATA>
<Zeile1>
<laenge>232.232</laenge>
<breite>19.484</breite>
<num>6</num>
<value>88</value>
<definition>OK</definition>
</Zeile1>

<Zeile2>

...etc...

</Zeile2>

...etc...
</DATA>
Ich hoffe, dass ich mein Problem genau genug beschrieben habe.
Auf welchem Weg kann ich am schnellsten zu meinem Ziel kommen.

Bin noch ziemlicher Python Anfänger. Ist für dieses Problem die Lösung am einfachsten über Python erreichbar?

Danke für die Beantwortung meiner doch etwas umfangreicheren Frage.

LG
Johannes :wink:

Verfasst: Donnerstag 9. März 2006, 18:23
von Mr_Snede
zum Einlesen könntest du Zeile für Zeile als String einlesen und mit der split() Funktion in eine Liste packen:

Code: Alles auswählen

>>> str = "tabs dazwischen      sind    lustig"
>>> str2 = str.split('\t')
>>> str2
['tabs', 'dazwischen', 'sind', 'lustig']
Ansonsten bietet sich auch das Modul csv an, da kann man als trenner auch Tabs angeben.

Zum Export such mal im Forum, da wurde in der Letzten Zeit öfters mit xml gearbeitet.

cu Sebastian

Verfasst: Freitag 10. März 2006, 22:27
von BlackJack
Davon die Zeilennummer in den Tagnamen mit einzubauen würde ich abraten. Für solche zusätzlichen Daten sind Attribute da.

Die Umwandlung liesse sich zum Beispiel so bewerkstelligen:

Code: Alles auswählen

import sys
from StringIO import StringIO

source = """\
< DATA_ >
<LAENGE>\t<BREITE>\t<NUM>\t<VALUE>\t<DEFINITION>
232.232\t19.484\t6\t88\tOK
222.2\t22.22\t4\t33\tNIN
2323.22\t19.886\t6\t22\tOOS
22.32\t19.886\t6\t23\tKKS
2323.12\t10.990\t5\t22\tMMM
< _DATA >
"""

def iter_data(lines):
    lines = iter(lines)
    # 
    # Search start.
    # 
    for line in lines:
        if line.strip() == '< DATA_ >':
            break
    # 
    # Read column headers.
    # 
    headers = [x.strip('<>\n').lower() for x in lines.next().split('\t')]
    yield headers
    # 
    # Read data.
    # 
    for line in lines:
        if line.strip() == '< _DATA >':
            break
        yield map(str.strip, line.split('\t'))


def write_xml(headers, data, outfile):
    # 
    # Prepare column tags.
    # 
    templates = ['  <%s>%%s</%s>\n' % (header, header) for header in headers]
    
    outfile.write('<DATA>\n')
    
    for i, values in enumerate(data):
        outfile.write('<Zeile nummer="%d">\n' % i)
        for template, value in zip(templates, values):
            outfile.write(template % value)
        outfile.write('</Zeile>\n')
    
    outfile.write('</DATA>\n')


def convert(infile, outfile):
    data_it = iter_data(infile)
    write_xml(data_it.next(), data_it, outfile)


def main():
    data_file = StringIO(source)
    convert(data_file, sys.stdout)


if __name__ == '__main__':
    main()

Verfasst: Montag 13. März 2006, 12:04
von keboo
hi!

Danke für deine zielführende Antwort!

Ich werde jetzt versuchen, die Befehle zu verstehen, damit ich dieses allgemeine Problem auch an andere Problemstellungen anpassen kann.

LG
Johannes

Verfasst: Montag 13. März 2006, 13:51
von keboo
Hi Leute!

Kann ma bitte wer ein wenig helfen den Code ein wenig zu kommentieren?
Wie kann ich das Outputfile eingeben?

Danke,

Johannes

Verfasst: Montag 13. März 2006, 14:47
von jens
Du kannst bei convert(data_file, sys.stdout) ein file-Objekt übergeben, also so:

Code: Alles auswählen

f = file("test.txt", "w")
convert(data_file, f)
f.close()