Seite 1 von 1
Listen Problem
Verfasst: Mittwoch 8. Februar 2006, 09:19
von tgooper
Hi!
Als Python Anfänger kämpfe ich gerade mit Listen.
Ich möchte Daten aus einem File auslesen und dann die Zeile x mit der Zeile x+1 vergleichen. Sind die beiden gleich, so wird der Eintrag gespeichert.
Mein Problem ist, folgende Fehlermeldung: "TypeError: descriptor 'append' requires a 'list' object but received a 'str' "
Wie kann ich jetzt den String in ein List Object umwandeln??
Verfasst: Mittwoch 8. Februar 2006, 09:30
von maxxle
Du solltest es vielleicht mal damit veruschen:
myList = list()
myList.append("myString")
Das würde dann bei dir wohl so aussehen:
for line in in_f.readline():
list.append(line)
Verfasst: Mittwoch 8. Februar 2006, 10:08
von tgooper
Besten Dank!
Verfasst: Mittwoch 8. Februar 2006, 11:28
von jens
Verfasst: Mittwoch 8. Februar 2006, 13:22
von tgooper
Habe mein Progamm jetzt schon fertig und mußte feststellen, dass mir das Progamm die Daten nicht richtig einliest.
Code: Alles auswählen
for line in in_f.readline():
helpme = in_f.readline()
re_helpme = re.compile ('^(?P<AST>\d+)+')
match = re_helpme.match(helpme)
result = match.group()
print result
mylist.append(result)
In der Liste stehen nur 17 Einträge, obwohl das File 550 hat. Meine Vermutung ist, dass es bei dem Befehl group liegt. Jedoch weiß ich keinen anderen Weg wie ich die Daten von re.compile sonst bekommen soll.
Hat wer Vorschläge?
Danke & LG
Verfasst: Mittwoch 8. Februar 2006, 13:35
von jens
Das sieht ja komisch aus
Versuch es mal so:
Code: Alles auswählen
mylist = []
re_helpme = re.compile ('^(?P<AST>\d+)+')
for line in in_f.readline():
match = re_helpme.match(line)
result = match.group()
print result
mylist.append(result)
print mylist
re compile muß man nur einmal machen, danach kann man mit dem re-Objekt arbeiten...
Du hast zwar ein for line in in_f.readline(): hat aber line überhaupt nicht benutzt, sondern direkt nochmal eine in_f.readline() abgefragt... Somit hast du eigentlich nur jede zweite Zeile ausgelesen...

Verfasst: Mittwoch 8. Februar 2006, 13:49
von tgooper
Wenn ich deinen Programmteil verwende, dann bekomme ich folgende Fehlermeldung:
Traceback (most recent call last):
File "C:\Python24\was\out.py", line 15, in ?
result = match.group()
AttributeError: 'NoneType' object has no attribute 'group'
Liest, das Progamm jetzt nichts aus?
Verfasst: Mittwoch 8. Februar 2006, 14:05
von jens
Deine RE stimmt wohl nicht...
Versuch es mal hiermit:
Code: Alles auswählen
mylist = []
re_helpme = re.compile ('^(?P<AST>\d+)+')
for line in in_f.readline():
match = re_helpme.match(line)
try:
result = match.group()
except:
print "ERROR:", line
else:
print result
mylist.append(result)
print mylist
Verfasst: Mittwoch 8. Februar 2006, 14:20
von tgooper
Mein File sieht wie folgt aus:
10233 2006-02-03
1332 2006-02-04
113 2006-02-04
10743 2006-02-03
10300 2006-02-03
10830 2006-02-02
10830 2006-02-03
108 2006-02-04
10743 2006-02-04
13061 2006-02-04
Da ich nur die Zahlen und nicht das Datum benötige, habe ich mir gedacht, dass ich mit re.compile ('^(?P<AST>\d+) +') die Zahlen auslesen kann.
Aber leider hat mir dein Programmteil gezeigt, dass es nicht so funktioniert.

Ist mein Ansatz so falsch??
Verfasst: Mittwoch 8. Februar 2006, 14:22
von jens
Da würde ich überhaupt kein RE nehmen, sondern einfach ein
line.split(" ",1)[0] machen
http://www.python.org/doc/current/lib/n ... ml#l2h-852
Verfasst: Mittwoch 8. Februar 2006, 14:33
von helmut
Hallo,
in dem Ausdruck: re_helpme = re.compile ('^(?P<AST>\d+)+') muss das letzte '+' entfernt werden; dann klappt es.
Gruss, Helmut
Verfasst: Mittwoch 8. Februar 2006, 14:41
von tgooper
Das ist ja ein praktisches Python Feature, aber leider bekomme ich auch nicht den gewünschten Output.
Code: Alles auswählen
for line in in_f.readline():
mylist.append(line.split(" ",1)[0])
print mylist
Leider bekomme ich nur die erste Zeile (10233 2006-02-03) ausgelesen:
['1', '0', '2', '3', '3', '', '2', '0', '0', '6', '-', '0', '2', '-', '0', '3','\n']
Verfasst: Mittwoch 8. Februar 2006, 14:44
von jens
Also das kann eigentlich nicht sein, bei mir klappt das:
Code: Alles auswählen
list = """10233 2006-02-03
1332 2006-02-04
113 2006-02-04
10743 2006-02-03
10300 2006-02-03
10830 2006-02-02
10830 2006-02-03
108 2006-02-04
10743 2006-02-04
13061 2006-02-04"""
list = list.split("\n")
mylist = []
for line in list:
result = line.split(" ",1)[0]
print result
mylist.append(result)
print mylist
Ausgaben:
10233
1332
113
10743
10300
10830
10830
108
10743
13061
['10233', '1332', '113', '10743', '10300', '10830', '10830', '108', '10743', '13061']
Verfasst: Mittwoch 8. Februar 2006, 14:46
von modelnine
Das ist sicherlich nicht Dein Code (folgendes strip() ändert nicht viel dran, ist aber sinnvoll weil Du auf ekel-Windows arbeitest mit \r\n-Zeilenenden).
Code: Alles auswählen
line = "10233 2006-02-03"
print line.strip().split(" ")[0]
liefert anstandslos:
Code: Alles auswählen
modelnine@phoenix ~ $ python
Python 2.4.2 (#1, Feb 5 2006, 17:30:13)
[GCC 4.0.2 (Gentoo 4.0.2-r3, pie-8.7.8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> line = "10233 2006-02-03"
>>> print line.strip().split(" ")[0]
10233
>>>
modelnine@phoenix ~ $
--- Heiko.
Verfasst: Mittwoch 8. Februar 2006, 23:39
von BlackJack
tgooper hat geschrieben:Das ist ja ein praktisches Python Feature, aber leider bekomme ich auch nicht den gewünschten Output.
Code: Alles auswählen
for line in in_f.readline():
mylist.append(line.split(" ",1)[0])
print mylist
Leider bekomme ich nur die erste Zeile (10233 2006-02-03) ausgelesen:
['1', '0', '2', '3', '3', '', '2', '0', '0', '6', '-', '0', '2', '-', '0', '3','\n']
Ist ja auch kein Wunder. `in_f.readline()` liest *eine* Zeile ein und mir der Vorschleife gehst Du dann über die *Zeichen* in dieser einen Zeile.
Lass einfach das `.readline()` weg, dann geht die Schleife über das Dateiobjekt, was bedeutet das `line` nacheinander an alle eingelesenen Zeilen gebunden wird.
Verfasst: Mittwoch 8. Februar 2006, 23:41
von modelnine
Autsch... Okay, das hätte auch jens und mir auffallen können.
