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

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: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

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

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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???
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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]#!/usr/bin/env python
import this[/code]
Antworten