Mehrzeilige Ausgabe verarbeiten

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
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Hallo Pythonfreunde,
ich versuche gerade aus einer Telnet Liste die ich als Mehrzeiligen String bekommen eine Liste zu füllen die dann in einen MySQL Datenbank rein kommt. Nun würde ich gerne wissen wie gehe ich an das mit der Liste am besten ran.

Die Ausgabe von Telnet ist:
2 7 65557 13948597 55552 17921258 2 52 27616 0 0 0 0 "XXXXXXXXX" "XXXXXXXXX" ""
20 3 41724 9415393 11509 3655730 2 37 15499 5260 0 5 56 "XXXXXXXXXX" "XXXXXXXX" "XXXXXXX"
Nun in einer Schleife soll die Zeile gesplittet werden und in die Tabelle eingefügt werden.

Hat da jemand eine Idee wie ich das am besten zerlege.

Viele Grüße
BasterTWO
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Wenn die Zeilen alle so einfach sind wie in deinem Beispiel, dann kannst du einfach split benutzen. Wenn die "strings" hinten auch Leerzeichen enthalten koennen (oder Schlimmeres), dann nimmst du wohl besser das csv-Modul.

Hier ein Beispiel mit split:

Code: Alles auswählen

>>> s = """2 7 65557 13948597 55552 17921258 2 52 27616 0 0 0 0 "XXXXXXXXX" "XXXXXXXXX" ""
... 20 3 41724 9415393 11509 3655730 2 37 15499 5260 0 5 56 "XXXXXXXXXX" "XXXXXXXX" "XXXXXXX" """
>>> for line in s.split("\n"): print line.split()
...
['2', '7', '65557', '13948597', '55552', '17921258', '2', '52', '27616', '0', '0', '0', '0', '"XXXXXXXXX"', '"XXXXXXXXX"', '""']
['20', '3', '41724', '9415393', '11509', '3655730', '2', '37', '15499', '5260', '0', '5', '56', '"XXXXXXXXXX"', '"XXXXXXXX"', '"XXXXXXX"']
EDIT: hatte cvs statt csv geschrieben... :oops:
Zuletzt geändert von Rebecca am Donnerstag 8. November 2007, 23:29, insgesamt 1-mal geändert.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Vielen Dank für die Schnelle Antwort nun ist mir leider aufgefallen das die Tabelle leider nicht so ganz gleich ist die Ausgabe der echten Quelle ist dann:
[]
['p_id', 'c_id', 'ps', 'bs', 'pr', 'br', 'pl', 'ping', 'logintime', 'idletime', 'cprivs', 'pprivs', 'pflags', 'ip', 'nick', 'loginname']
['1', '3', '1985', '53418', '45', '988', '0', '37', '2055', '2051', '0', '5', '56', '"XXXXXXX"',"XXXXXX", '"XXXXXX"', '"XXXX"']
['OK']
Da ist mir leider aufgefallen das bei der ersten XXXXXX Spalte auch Leerzeichen drin sein könnten kann man das auch berügsichtigen. Es kommt nun leider noch dazu das zwei Zeilen am Anfang kommen die nicht in die Tabelle sollen und noch am Ende das OK aber das könnte mal mit einer if anweisung überprüfen oder gibt es noch eine bessere Möglichkeit.

Viele Grüße
BasterTWO
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

In dem Fall kannst du re.split() verwenden, und dabei auf die Quotes achten.
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Entschuldigt wenn ich mich blöd anstelle aber ich verstehe nicht wie ich das mit csv mach soll und das mit re.split() gibt für mich keinen Sinn.

BasterTWO
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BasterTWO hat geschrieben:wie ich das mit csv mach soll
Hallo BasterTWO!

Z.B. so:

Code: Alles auswählen

>>> import csv
>>> s = '''2 7 65557 13948597 55552 17921258 2 52 27616 0 0 0 0 "XXXXXX XXX" "XXXXXXXXX" ""
... 20 3 41724 9415393 11509 3655730 2 37 15499 5260 0 5 56 "XXXXXXXXXX" "XXXX XXXX" "XXXXX XX"'''
>>> lines = csv.reader(s.splitlines(), delimiter = " ")
>>> for line in lines:
...     print repr(line)
...     
['2', '7', '65557', '13948597', '55552', '17921258', '2', '52', 
'27616', '0', '0', '0', '0', 'XXXXXX XXX', 'XXXXXXXXX', '']
['20', '3', '41724', '9415393', '11509', '3655730', '2', '37', 
'15499', '5260', '0', '5', '56', 'XXXXXXXXXX', 'XXXX XXXX', 'XXXXX XX']
>>>

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Das Problem ist nur wenn ich nun deinen Code tete gerold dann bekomme ich das:
[]
['p_id\tc_id\tps\tbs\tpr\tbr\tpl\tping\tlogintime\tidletime\tcprivs\tpprivs\tpflags\tip\tnick\tloginname']
['2\t7\t33468\t8419112\t30270\t9796945\t1\t55\t10021\t0\t0\t0\t0\t"87.165.229.229"\t"BriXx"\t""\t']
['3\t7\t45154\t12515145\t17273\t5567209\t153\t19\t9208\t60\t0\t5\t0\t"84.173.254.221"\t"B.s.a.^|', 'Namrock"\t"namrock"\t']
['OK']
Wie kann ich machen das ein Abstand von genau 4 Leerzeichen genommen wird um einen neuen ListenEintrag zu generieren das ist mir gerade erst aufgefanne.

Viele Grüße
BasterTWO
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

Da hättest du vielleicht verraten sollen, dass es Tabs statt Leerzeichen sind...
also: delimiter='\t'
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Bei dir ist das Trennzeichen anscheinend ein Tabulator, keine Leerzeichen. In Gerolds Beispiel muesstest du dann delimiter="\t" setzen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Danke für diesen Tipp nun ist es auch schon nur leider als CSV Reader Objekt das ist aber auch nicht schlimm, Schlimmer ist das er 1 Zeige leer hat dann die zweite mit Bezeichnungen wie es im Telnet steht und dann und dann in der letzten zeile OK. Nun will ich aber nur das nach der Bezeichnung bis zum OK aber ohne das OK. Kann man das einfach machen ???

Viele Grüße
BasterTWO
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Code: Alles auswählen

>>> lines = csv.reader(s.splitlines(), delimiter = " ")
>>> for line in lines:
...     if line:
...          print repr(line) 
Sollte es tun :)
LG
Hi! I'm a .signature virus! copy me into your .signature file to help me spread!
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Nun müsste die Ausgabe von CVS zu einer List werden und die erste Zeile
['p_id', 'c_id', 'ps', 'bs', 'pr', 'br', 'pl', 'ping', 'logintime', 'idletime', 'cprivs', 'pprivs', 'pflags', 'ip', 'nick', 'loginname']
Müsste noch verschwinden damit ich die Daten in einen SQL Befehl einbauen kann die dann die Daten in eine Tabelle hinzufügt.

Ich weis das ich nerve aber leider kenne ich mich auf diesem Gebiet nicht aus.

Viele Grüße
BasterTWO
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Ich habe nun wieder etwas herunprobiert und habe nun das zusammen geschrieben:

Code: Alles auswählen

x = 1
	for line in content:
		x = x + 1
		s = content.split("\n")
		s = s[x].split("\t")
		print s
So nun habe ich einproblem wie kann ich verhindern das er mit beim Durchsplitten am Ende der Liste folgen Fehler bringt:
Traceback (most recent call last):
File "user2mysql.py", line 72, in <module>
main()
File "user2mysql.py", line 63, in main
s = s[x].split("\t")
IndexError: list index out of range
Meine Liste aber sieht dafür nun schön geordnet aus:
['7', '7', '3221', '85191', '2411', '760776', '147', '200', '3382', '1587', '0', '5', '0', '"91.49.87.176"', '"B.s.a.^| Namrock"', '"namrock"', '\r']
['9', '1', '105', '9022', '28', '824', '4043', '44', '92', '7', '0', '5', '0', '"91.49.93.10"', '"b.s.a^| Jarus"', '"christoph"', '\r']
['OK']
Das beste wäre wenn er bei OK einfach einen break macht leider habe ich das mit einer if Anweisung nicht hinbekommen hat jemand einen Gedankenanstos für mich ???

Viele Grüße
BasterTWO
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BasterTWO hat geschrieben:Das beste wäre wenn er bei OK einfach einen break macht leider habe ich das mit einer if Anweisung nicht hinbekommen hat jemand einen Gedankenanstos für mich ???

Code: Alles auswählen

if s[0] == 'OK':
    break
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BasterTWO
User
Beiträge: 75
Registriert: Donnerstag 25. Oktober 2007, 20:03

Meinst du das etwa so:

Code: Alles auswählen

x = 1
	for line in content:
		x = x + 1
		s = content.split("\n")
		if s[0] == 'OK':
    			break
		s = s[x].split("\t")
		print s
Denn so geht es leider nicht :cry:

Viele Grüße
BasterTWO

PS: hinter dem OK fehlt ein '
Antworten