Wertetabelle in Pythonarray bzw. XML Datei schreiben

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
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Donnerstag 9. März 2006, 17:52

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:
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Donnerstag 9. März 2006, 18:23

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
BlackJack

Freitag 10. März 2006, 22:27

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()
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Montag 13. März 2006, 12:04

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
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Montag 13. März 2006, 13:51

Hi Leute!

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

Danke,

Johannes
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 13. März 2006, 14:47

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()

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten