string nach zahlen scannen

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.
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

string nach zahlen scannen

Beitragvon fk08 » Donnerstag 3. April 2008, 15:59

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

Beitragvon jens » Donnerstag 3. April 2008, 16:07

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

Beitragvon fk08 » Donnerstag 3. April 2008, 16:51

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

Beitragvon jens » Donnerstag 3. April 2008, 16:56

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

Beitragvon fk08 » Donnerstag 3. April 2008, 16:59

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Donnerstag 3. April 2008, 18:01

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.
midan23
User
Beiträge: 116
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Beitragvon midan23 » Donnerstag 3. April 2008, 18:02

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 ...
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Donnerstag 3. April 2008, 18:09

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

Beitragvon BlackJack » Donnerstag 3. April 2008, 18:09

Kann es sein, dass ein einfaches ``map(float, line.split())`` pro Zeile ausreicht!?
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

Beitragvon fk08 » Donnerstag 3. April 2008, 22:01

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?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Donnerstag 3. April 2008, 22:30

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())
fk08
User
Beiträge: 37
Registriert: Donnerstag 20. März 2008, 13:46

Beitragvon fk08 » Donnerstag 3. April 2008, 22:43

danke! es funzt!

Wer ist online?

Mitglieder in diesem Forum: Baidu [Spider], Bing [Bot], halobungie, martinjo