Seite 1 von 1

Mehrzeilige Ausgabe verarbeiten

Verfasst: Donnerstag 8. November 2007, 21:34
von BasterTWO
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

Verfasst: Donnerstag 8. November 2007, 22:03
von Rebecca
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:

Super

Verfasst: Donnerstag 8. November 2007, 22:52
von BasterTWO
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

Verfasst: Freitag 9. November 2007, 12:43
von windner
In dem Fall kannst du re.split() verwenden, und dabei auf die Quotes achten.

Entschuldigt

Verfasst: Sonntag 11. November 2007, 00:38
von BasterTWO
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

Re: Entschuldigt

Verfasst: Sonntag 11. November 2007, 01:25
von gerold
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
:-)

Das Problem

Verfasst: Montag 12. November 2007, 17:40
von BasterTWO
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

Verfasst: Montag 12. November 2007, 17:44
von windner
Da hättest du vielleicht verraten sollen, dass es Tabs statt Leerzeichen sind...
also: delimiter='\t'

Verfasst: Montag 12. November 2007, 17:45
von Rebecca
Bei dir ist das Trennzeichen anscheinend ein Tabulator, keine Leerzeichen. In Gerolds Beispiel muesstest du dann delimiter="\t" setzen.

Danke

Verfasst: Montag 12. November 2007, 18:31
von BasterTWO
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

Verfasst: Montag 12. November 2007, 19:27
von CrackPod

Code: Alles auswählen

>>> lines = csv.reader(s.splitlines(), delimiter = " ")
>>> for line in lines:
...     if line:
...          print repr(line) 
Sollte es tun :)
LG

OK

Verfasst: Montag 12. November 2007, 21:25
von BasterTWO
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

So

Verfasst: Mittwoch 14. November 2007, 19:55
von BasterTWO
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

Re: So

Verfasst: Mittwoch 14. November 2007, 20:07
von Leonidas
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

Meinst

Verfasst: Mittwoch 14. November 2007, 20:12
von BasterTWO
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 '