Seite 1 von 1

string nach zahlen scannen

Verfasst: Donnerstag 3. April 2008, 15:59
von fk08
hallo,

ich habe einen string z.B '56\t89\t78\n'
wobei dieser aus einer datei eingelesen wird.
nun möchte ich aus diesem string die zahlen extrahieren und in eine neue liste schreiben, damit man mit den zahlen rechnen kann?

danke

Verfasst: Donnerstag 3. April 2008, 16:07
von jens
Entweder RE findall mit \d oder eine for Schleife drüber, mit readlines und .split("\t"), und nachsehen ob es eine Zahl ist, z.B. mit if x in string.digits...

Verfasst: Donnerstag 3. April 2008, 16:51
von fk08
danke, aber wenn ich z.B folgenden String habe:

'1.155E+3\r1.157E+3\r1.131E+3'

und ich re.findall('\d',"...")

dann kriege ich natürlich:
['1', '1', '5', '5', '3', '1', '1', '5', '7', '3', '1', '1', '3', '1', '3']

wie kriege ich denn aber:

['1.155E+3','1.157E+3','1.131E+3']

ich befürchte, dass es eine einfachere art gibt eine datei auszulesen...

leider funktionierts mit load nicht (--->load von pylab) da meine einträge in der datei aus zeilen und leerzeile und spalten ... bestehen.

Verfasst: Donnerstag 3. April 2008, 16:56
von jens
OK, dann ist RE vielleicht keine gute Idee ;)

Versuche erstmal die Daten in einer For Schleife auseinander zu pflücken. Also mit readlines() einlesen und dann mit spit() arbeiten.

Die Zahlen selber sind ja erstmal Strings. Du kannst diese mit int(), long(), float() usw. umwandeln, siehe: http://docs.python.org/dev/library/stdt ... pesnumeric

Verfasst: Donnerstag 3. April 2008, 16:59
von fk08
ok, also mit re.findall geht es, wenn man

re.findall('\d{3}\E\+\d{1}',"STRING")

macht, ist aber ein wenig unflexibel, sollte sobald man eine größere zahl hat nicht funktionieren...:)

ich versuch mal,dass was du eben vorgeschlagen hast

Verfasst: Donnerstag 3. April 2008, 18:01
von Hyperion
Sollte doch machbar sein! Du suchst eine Zahl, die von einem Punkt gefolgt sein muss, dann beliebig viele Zahlen, dann ein "E+" und dann beliebig viele Zahlen.

Verfasst: Donnerstag 3. April 2008, 18:02
von midan23
Kurze Frage zum Dateiformat:

Kann es sein, das es sich dabei um eine Datei im TSV-Format handelt ?

(TSV = Tab Separated Values, ein Verwandter des CSV-Formats in dem als Trennzeichen zwischen den Spalten ein Tab-Zeichen verwendet wird)

Wenn ja: So weit ich weiss, kann man dem CSV-Reader das verwendete Trennzeichen angeben ...

Verfasst: Donnerstag 3. April 2008, 18:09
von audax
Für solche Fälle ist Regexp::Commonf für Perl toll:
http://search.cpan.org/perldoc?Regexp::Common
Einzusetzen wie folgt:

Code: Alles auswählen

 perl -MRegexp::Common -e 'print  $RE{num}{real}' 
Und das dann copy&paste bei Python rein, kurz testen und ab dafür.
Die sind in aller Regel kompatibel zu Python.

Verfasst: Donnerstag 3. April 2008, 18:09
von BlackJack
Kann es sein, dass ein einfaches ``map(float, line.split())`` pro Zeile ausreicht!?

Verfasst: Donnerstag 3. April 2008, 22:01
von fk08
jo, hab diverse sachen ausprobiert!

am besten funktioniert map!

nun stehe ich vor einem "fast peinlichen" problem...

hier der code:

Code: Alles auswählen

#!/usr/bin/python
from pylab import *
import string
in_file = open("/home/user1/uni/python/data.dat",'r')

data_string = in_file.readlines() 

for i in range(0,len(data_string)):
	a = map(float, data_string[i].split())
	print a
else:
	print "fertig \n",a
	
	
wie kriege ich es hin, dass am ende eine liste mit allen einträgen die im if block gemacht wurden entsteht,
denn "print a" zeigt nur die letze bearbeitete zeile an

vereinfacht meine ich:
sum = sum +x

macht man sowas mit append?

Verfasst: Donnerstag 3. April 2008, 22:30
von audax

Code: Alles auswählen

#!/usr/bin/python
import pylab as lab

in_file = open("/home/user1/uni/python/data.dat",'r')
data= in_file.read()

numbers = map(float, data.split())
oder, deinem näher:

Code: Alles auswählen

numbers = []
for line in in_file:
    number += map(float, data_string[i].split())

Verfasst: Donnerstag 3. April 2008, 22:43
von fk08
danke! es funzt!