Seite 1 von 1
Zeile in File anspringen
Verfasst: Donnerstag 20. Januar 2005, 23:29
von 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
Verfasst: Donnerstag 20. Januar 2005, 23:56
von XT@ngel
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
Verfasst: Freitag 21. Januar 2005, 00:11
von 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
Verfasst: Freitag 21. Januar 2005, 02:14
von Dookie
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
Verfasst: Freitag 21. Januar 2005, 08:45
von jens
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???
Verfasst: Freitag 21. Januar 2005, 14:01
von Dookie
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