Listen Problem

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.
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Mittwoch 8. Februar 2006, 09:19

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' "

Code: Alles auswählen

for line in in_f.readline():
  list = list.append(line)
Wie kann ich jetzt den String in ein List Object umwandeln??
maxxle
User
Beiträge: 12
Registriert: Dienstag 12. Juli 2005, 13:54

Mittwoch 8. Februar 2006, 09:30

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)
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Mittwoch 8. Februar 2006, 10:08

Besten Dank!
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 8. Februar 2006, 11:28


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Mittwoch 8. Februar 2006, 13:22

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 8. Februar 2006, 13:35

Das sieht ja komisch aus :roll:

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... :lol:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Mittwoch 8. Februar 2006, 13:49

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?
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 8. Februar 2006, 14:05

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Mittwoch 8. Februar 2006, 14:20

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??
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 8. Februar 2006, 14:22

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

Mittwoch 8. Februar 2006, 14:33

Hallo,

in dem Ausdruck: re_helpme = re.compile ('^(?P<AST>\d+)+') muss das letzte '+' entfernt werden; dann klappt es.

Gruss, Helmut
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Mittwoch 8. Februar 2006, 14:41

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']
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 8. Februar 2006, 14:44

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']

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Mittwoch 8. Februar 2006, 14:46

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

Mittwoch 8. Februar 2006, 23:39

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