Zeile in File anspringen

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.
Gast

Zeile in File anspringen

Beitragvon Gast » Donnerstag 20. Januar 2005, 23:29

Hallo,
ich bin relativ neu in Python...

gibt es eine möglichkeit in einem File eine Zeile direkt anzuspringen?

Also z.B sähe das file so aus:

Daten:

a = 2
b = 4
c = 8

Zusatz:

d = 5
e = 6
f = 7

ich bräuchte einfach das file halt zeilenweise einlesen und dann wenn die section Daten kommt dort weiterlesen und nur die Werte die unter Daten stehen herausnehmen...

Danke euch
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Beitragvon XT@ngel » Donnerstag 20. Januar 2005, 23:56

Also bestimmt kommt jemand mit einer besseren Lösung, aber auf die schnelle würde ich das so machen:

Code: Alles auswählen

fp = open("test.txt")
lines = fp.readlines()

try:
    start_pos = lines.index("Daten:\n")
    end_pos = lines.index("Zusatz:\n")
    for line in lines[start_pos:end_pos]:
        # leere Zeilen werden übersprungen
        if len(line) > 1:
            print line

except ValueError:
    print "Nicht gefunden"


Vielleicht hilft dir das weiter: http://python.sandtner.org/viewtopic.php?t=1785

gute nacht
Andreas
Gast

Beitragvon Gast » Freitag 21. Januar 2005, 00:11

vielen dank andreas,
ich denke damit könnte ich vorerst arbeiten ja.

Ich habe etwas über Dateideskriptoren gelesen...allerdings haut es bei mir nicht so ganz hin mit fileno() und seek(fd)...

vielleicht weiß da jemand gut bescheid?

Danke
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 21. Januar 2005, 02:14

Hi Gast,

da die Zeilen unterschiedlich lang sind, hilft dir seek nicht weiter. Du musst praktisch alle Zeilen einlesen und testen wann die Daten-Sektion kommt und dann kannst du die nachfolgenden Zeilen in eine Liste einlesen.

Hier noch eine andere Lösung.

Code: Alles auswählen

daten = []
flag = False
f = file("daten.txt", 'r')
for line in f:
    line = line.strip()
    if not line:
        continue # Leerzeilen überspringen
    if flag:
        if line == "Zusatz:":
            break
        daten.append(line)
    if line == "Daten:":
        flag = True
f.close()


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 21. Januar 2005, 08:45

Mir fällt da gerade die funktionsweise des sgmllib.SGMLParser ein. Hab mal was ähnliches gebaut:

Code: Alles auswählen

txt="""
test:
blabla

Daten:

a = 2
b = 4
c = 8

Zusatz:

d = 5
e = 6
f = 7"""

def Daten(zeile):
    print "Daten:",zeile

def Zusatz(zeile):
    print "Zusatz:",zeile

def undefiniert(zeile):
    print "undefiniert:",zeile

txt = txt.splitlines()
print txt

type = None
for zeile in txt:
    #Leerzeilen überspringen
    if zeile=="": continue

    if zeile=="Daten:":
        type = "Daten"
        continue
    elif zeile == "Zusatz:":
        type = "Zusatz"
        continue

    if type == "Daten":
        Daten(zeile)
    elif type == "Zusatz":
        Zusatz(zeile)
    else:
        undefiniert(zeile)


Nun hab ich mich gefragt, wie man es noch kürzen kann... Denn wie man sieht werden viele gleiche Sachen gemacht... Außerdem ist diese Variante wesendlich flexibler, weil man einfach neue "Sektionen" wie z.B. "test:" einfügen kann. Man muß nur noch ein "function test(zeile):" einfügen, um diese Werte zu bearbeiten.
Hier mal eine böse Variante mit eval():

Code: Alles auswählen

txt="""
test:
blabla

Daten:

a = 2
b = 4
c = 8

Zusatz:

d = 5
e = 6
f = 7"""

def Daten(zeile):
    print "Daten:",zeile

def Zusatz(zeile):
    print "Zusatz:",zeile

def undefiniert(zeile):
    print "undefiniert:",zeile

txt = txt.splitlines()
print txt

for zeile in txt:
    #Leerzeilen überspringen
    if zeile=="": continue

    if zeile[-1]==":":
        typ = zeile[:-1]
        continue

    try:
        eval(typ+"('"+zeile+"')")
    except NameError:
        undefiniert(zeile)

Wie kann man es ohne eval() machen???
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Freitag 21. Januar 2005, 14:01

Hi jens,

1. könntest Du die Funktionen mit den Namen in ein Dictionary eintragen oder 2. das Dictionary globals() verwenden.

Code: Alles auswählen

...
typ = "" # vorbelegen
for zeile in txt:
    #Leerzeilen überspringen
    if zeile=="": continue

    if zeile[-1]==":":
        typ = zeile[:-1]
        continue

    try:
        globals()[typ](zeile)
    except KeyError:
        undefiniert(zeile)


Gruß

Fritz

Code: Alles auswählen

#!/usr/bin/env python
import this

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder