einlesen und verarbeiten von daten

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.
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

hmmm vlt hat grad wer zeit mir dabei zu helfen, ich bin soweit dass ich die data einlesen und in tupel zerlegen kann, nur wenn ich nach projectile suche und dort den 4. und 5. eintrag haben will und diesen dann z.b. in einem anderne tupel zu speichern bekomm ich die meldung

:~/Desktop/kaons$ python new.py
UQMD
Traceback (most recent call last):
File "new.py", line 31, in <module>
print splittn[3]
IndexError: tuple index out of range

Code: Alles auswählen

import string


	
fdata = open("apal26-qmda-4gev.f14","r")
while True:
	for line in fdata:
#	splittn = line.split()
		splittn = line.partition(" ")
	
		if ("UQMD") in splittn:
			print splittn[0]
		if ("projectile:") in splittn:
			print splittn[3]
#		else:
#			print "nicht drin"

#		pro = splittn.index("projectile:")+3
#		print pro
		
fdata.close()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gib Dir doch mal "splittn" aus ... dann wirst Du sehen, dass es kein 4. Feld gibt!

btw: bei if's kann (sollte) man die Klammern weglassen!

Code: Alles auswählen

# unschön
if ("UQMD") in splittn:
    pass
# besser
if "UQMD" in splittn:
    pass
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

str.partition gibt ein tupel der Länge 3 zurück, d.h. das letzte Element hat den Index 2:

Code: Alles auswählen

In [35]: foo = "a string containing the letters UQMD and some more words at the end"

In [36]: foo.partition("UQMD")
Out[36]: ('a string containing the letters ', 'UQMD', ' and some more words at the end')

In [37]: foo.partition("UQMD")[0]
Out[37]: 'a string containing the letters '

In [38]: foo.partition("UQMD")[2]
Out[38]: ' and some more words at the end'
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

jo alles klar hab ma die klammern weg

und ja es gibt keinen [3], aber die frage ist warum, weil die line doch viel größer ist und viel mehr inhalte hat, ich verweise nochma auf die gepaste datei im anhang weiter oben
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

quant hat geschrieben: und ja es gibt keinen [3], aber die frage ist warum, weil die line doch viel größer ist und viel mehr inhalte hat, ich verweise nochma auf die gepaste datei im anhang weiter oben
Und ich verweise mal auf die Doku zu str.partition()! ;-) Da steht es doch genau erklärt ... Du suchst wohl eher str.split()!
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

ahh ich seh schon wen ich es mit folgendem code mache

Code: Alles auswählen

fdata = open("apal26-qmda-4gev.f14","r")
while True:
	for line in fdata:
#	splittn = line.split()
		splittn = line.split(" ")
#	line.find("UQMD")
#	while True:
		
		if "UQMD" in splittn:
			print splittn[0]
		if ("projectile:") in splittn:
#			pass
			print splittn[4]
#			pro = (splittn[10], splittn[11])
#			print pro
#		else:
#			print "nicht drin"

#		pro = splittn.index("projectile:")+3
#		print pro
		
fdata.close()
würde ich zwar ein ergebis bekommen aber dieses also print splittn[4] wäre ein zahl genauer -1 und diese zeigt er mir nicht an, gibts da ne andere möglichkeit ?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

quant hat geschrieben: würde ich zwar ein ergebis bekommen aber dieses also print splittn[4] wäre ein zahl genauer -1 und diese zeigt er mir nicht an, gibts da ne andere möglichkeit ?
Hä? Sorry, das kann niemand verstehen!
BlackJack

@quant: Komm doch jetzt bitte nicht mit jedem Mist angekleckert, den Du ganz einfach selber ausprobieren kannst. Wenn ``splittn[4]`` nicht das enthält, was Du erwartest, dann lass Dir doch einfach mal ``splittn`` an der Stelle komplett ausgeben. Das sieht dann ungefähr so aus:

Code: Alles auswählen

In [500]: s = 'projectile:  (mass, char)  197  79   target:  (mass, char)  197  79'

In [501]: s.split(' ')
Out[501]:
['projectile:',
 '',
 '(mass,',
 'char)',
 '',
 '197',
 '',
 '79',
 '',
 '',
 'target:',
 '',
 '(mass,',
 'char)',
 '',
 '197',
 '',
 '79']

In [502]: s.split(' ')[4]
Out[502]: ''
Dann liest man mal in der Doku nach was das Argument bedeutet und was es bedeutet, wenn man *kein* Argument übergibt und kommt da drauf:

Code: Alles auswählen

In [503]: s.split()
Out[503]:
['projectile:',
 '(mass,',
 'char)',
 '197',
 '79',
 'target:',
 '(mass,',
 'char)',
 '197',
 '79']

In [504]: s.split()[4]
Out[504]: '79'
Dir wurde empfohlen das Tutorial durchzuarbeiten. Nicht nur lesen, sondern auch ausprobieren und variieren. Viele Fragen lassen sich der Python-Shell schneller selber beantworten, als wenn man die erst hier reinstellt.
quant
User
Beiträge: 34
Registriert: Freitag 29. Mai 2009, 12:06

hmm ok ich habs gelöst glaub ich ^^ es waren mehr lehrzeichen dazwischen und deswegen hat er anscheinend diese mit augenommen als leere argumente im listings kann man das irgendwie verändern also die leerstellen rausnehmen ?

Code: Alles auswählen

UQMD   version:       20030   1000  20030  output_file  14
projectile:  (ityp, char)   -1  -1   target:  (mass, char)   26  13 
es sieht also jetzt so aus :

Code: Alles auswählen

import string


	
fdata = open("apal26-qmda-4gev.f14","r")
while True:
	for line in fdata:
		splittn = line.split(" ")

		if "UQMD" in splittn:
			print splittn[0]
		if ("projectile:") in splittn:
#			pass
			print splittn[6]
		
fdata.close()
BlackJack

@quant: Schau Dir noch einmal meinen letzten Beitrag an.

Du hast da übrigens eine nette Endlosschleife gebastelt.
Benutzeravatar
krisi12345
User
Beiträge: 205
Registriert: Mittwoch 4. März 2009, 16:56
Wohnort: Das schöne München
Kontaktdaten:

Also Ich glaube beim momentanen Stand von diesem Thema bin Ich schon etwas zurück geblieben, aber:
Ich hab auch schon mal ein Programm geschrieben wo eine Datei gespeichert wird und dann auch wieder ausgelesen werden soll.
Dabei hab Ich versucht etwas bestimmten z.B. einer Zeile einen Namen zu geben.
Die Datei würde dann in etwa so aussehen:

9991-kris
9992-whg

Dabei entspricht dass 9991-9992 einem Wert in diesem Fall Vorname und Schule.
Beim Minus wird die Zeile in zwei Teile unterteilt wobei dann nur noch ein Teil gebraucht wird.
http://openbook.galileocomputing.de/pyt ... ac21d3a754
Antworten