Strings aus Datei 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
Biersauf

hey da!

ist es möglich strings aus einer datei zu extrahieren und sie z.b. in eine variable speichern? ich habe also folgende datei vorliegen und müsste jeweils den wert von "in", "out", "tyep", "q" usw. herausfiltern........

Code: Alles auswählen

in:10 out:10 type:2 q:2.000000 itex:0 ptex:0 mv:504 misc:1800 fcode:1 bcode:1 mc-var:338688 var:87912 icount:0;
in:11 out:11 type:2 q:2.000000 itex:0 ptex:0 mv:504 misc:1800 fcode:1 bcode:1 mc-var:338688 var:87912 icount:0;
in:12 out:12 type:1 q:2.000000 itex:25971 ptex:0 mv:0 misc:9721 fcode:1 bcode:1 mc-var:340264 var:86583 icount:1620;
in:13 out:13 type:1 q:2.000000 itex:28408 ptex:0 mv:0 misc:10006 fcode:1 bcode:1 mc-var:335228 var:87402 icount:1620;
in:14 out:14 type:2 q:2.000000 itex:327 ptex:1977 mv:1106 misc:4205 fcode:1 bcode:1 mc-var:335744 var:87351 icount:16;
in:15 out:15 type:2 q:2.000000 itex:609 ptex:7490 mv:2183 misc:8335 fcode:1 bcode:1 mc-var:335634 var:87803 icount:30;
in:16 out:16 type:2 q:2.000000 itex:226 ptex:4129 mv:1888 misc:6443 fcode:1 bcode:1 mc-var:338594 var:87819 icount:10;
in:17 out:17 type:2 q:2.000000 itex:186 ptex:2509 mv:1434 misc:4750 fcode:1 bcode:1 mc-var:338596 var:87824 icount:7;
in:18 out:18 type:2 q:2.000000 itex:315 ptex:1381 mv:785 misc:2977 fcode:1 bcode:1 mc-var:338650 var:87824 icount:13;
in:19 out:19 type:2 q:2.000000 itex:853 ptex:1859 mv:1010 misc:3154 fcode:1 bcode:1 mc-var:338755 var:87878 icount:38;
in:20 out:20 type:2 q:2.000000 itex:2680 ptex:4452 mv:1531 misc:4752 fcode:2 bcode:1 mc-var:338904 var:87759 icount:124;
in:21 out:21 type:2 q:2.000000 itex:14189 ptex:9745 mv:1755 misc:10207 fcode:2 bcode:1 mc-var:328247 var:87415 icount:570;
geht das?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Ohne Probleme... am leichtesten geht das wohl mit Regulären Ausdrücken, z.B. so:

Code: Alles auswählen

import re
f=open('dateiname.xyz','r')
data=re.findall('in:(\d*?) out:(\d*?) type:(\d*?) q:(\d*?\.\d*?) itex:(\d*?) ptex:(\d*?) mv:(\d*?) misc:(\d*?) fcode:(\d*?) bcode:(\d*?) mc-var:(\d*?) var:(\d*?) icount:(\d*?);',f.read())
f.close()
Als Ergebnis erhälst du eine Liste von Tupeln, wobei jedes Tupel eine Zeile von Werten darstellt (in der Reihenfolge, wie oben bei dir).
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Biersauf,

das geht aber auch ohne re.

Code: Alles auswählen

f = open(dateiname.txt, "r"):
entries = []
for zeile in f:
    tmp = zeile.strip().split()
    tmpdict = {}
    for item in tmp:
        key, value = item.split(":")
        tmpdict[key] = value
    entries.append(tmpdict)
f.close()
in entries hast Du dann zeilenweise die key, value Paare als Dictionary.


Gruß

Dookie
Biersauf

hmm ja dann habe ich aber eine liste von allen werten. wenn ich jetzt z.b. nur die werte aus "q" haben möchte......wie mache ich das dann?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Code: Alles auswählen

f = open(dateiname.txt, "r"):
entries = {"in":[], "out":[], "type":[], "q":[], "itex":[], "ptex":[], "mv":[],
           "misc":[], "fcode":[], "bcode":[], "mc-var":[], "var":[], "icount":[]}
for zeile in f:
    tmp = zeile.strip().split()
    for item in tmp:
        key, value = item.split(":")
        entries[key].append(value)
f.close()
jetzt ist entries ein Dictionary, mit den keys und listen mit den Werten. also den Eintrag q von der ersten Zeile erreichst Du über entries["q"][0] den von der 3. Zeile über entries["q"][2] ...
entries["q"] liefert Dir die liste mit allen "q" Werten.


Dookie
Antworten