Seite 1 von 1

Bestimmten Wert aus Datei auslesen

Verfasst: Sonntag 26. April 2009, 00:36
von bankkind
Hallo,

ich habe mal wieder eine Dumme Frage. Ich habe ein Skript das soll mir aus einer Textdatei einen Wert auslesen und auswerten. ich scheitere omentan schon bei dem Wert...

Ich lese Die Datei Zeilenweise ein mit einer For-Schleife, dann prüfe ich bei jedem Durchlauf mit :

Code: Alles auswählen

a = string.find(b,c)
Ob der gesuchte String vorkommt.

Wie kann ich aber jetzt das auftreten prüfen?

Code: Alles auswählen

if string.find(b,c):

Code: Alles auswählen

a = string.find(b,c)
if a:

Code: Alles auswählen

if if string.find(b,c) == TRUE:
Irgendwie komme ich hier nicht weiter... oder ich habe einfach nur einen Denkfehler... :-(

bankkind

Verfasst: Sonntag 26. April 2009, 00:40
von DasIch

Code: Alles auswählen

In [1]: 'foo' in 'foobar'
Out[1]: True

Verfasst: Sonntag 26. April 2009, 06:37
von BlackJack
@bankkind: Die Funktionen im `string`-Modul, die auch als Methoden auf Zeichenketten existieren, sollte man nicht mehr verwenden. Ab Python 3.0 gibt's die nämlich nicht mehr.

Verfasst: Sonntag 26. April 2009, 09:57
von str1442
str.find gibt -1 bei Nichtvorhandensein zurück. Will man etwas handfesteres sollte man str.index benutzen. Aber für tests auf Vorhandensein am besten "in" benutzen, wie von DasIch gezeigt.

Verfasst: Sonntag 26. April 2009, 11:40
von bankkind
BlackJack hat geschrieben:@bankkind: Die Funktionen im `string`-Modul, die auch als Methoden auf Zeichenketten existieren, sollte man nicht mehr verwenden. Ab Python 3.0 gibt's die nämlich nicht mehr.
OK, danke für den Tipp, aber gibt es hierfür Gründe? Welche Alternativen habe ich die ähnlich einfach zu handhaben sind?

Verfasst: Sonntag 26. April 2009, 11:53
von BlackJack
Na der Grund ist, das die Funktionen doppelt vorhanden sind, eben einmal im Modul `strings` und als Methoden auf Zeichenketten. Da Python eine objektorientierte Sprache ist, hat man sich entschieden die alten Funktionen aus dem Modul als "deprecated" einzustufen, und dann in Python 3.0 endgültig zu entsorgen.

Verfasst: Sonntag 26. April 2009, 11:59
von Dill
was ist denn an s1 in s2 nicht einfach?

der grund ist, dass es die momentan doppelt gibt:

[code = py]
In [12]: string.find
Out[12]: <function find at 0x00BDB3F0>

In [13]: string.find?
Type: function
Base Class: <type 'function'>
String Form: <function find at 0x00BDB3F0>
Namespace: Interactive
File: c:\python25\lib\string.py
Definition: string.find(s, *args)
Docstring:
find(s, sub [,start [,end]]) -> in

Return the lowest index in s where substring sub is found,
such that sub is contained within s[start,end]. Optional
arguments start and end are interpreted as in slice notation.

Return -1 on failure.


In [14]: "".find
Out[14]: <built-in method find of str object at 0x00A0A038>

In [15]: "".find?
Type: str
Base Class: <type 'str'>
String Form:
Namespace: Interactive
Length: 0
Docstring:
str(object) -> string

Return a nice string representation of the object.
If the argument is a string, the return value is the same object.
[/code]

Verfasst: Sonntag 26. April 2009, 13:08
von bankkind
OK! Und wenn es nicht nur ums vorhanden sein geht, sondern ich auch bestimmte Information aus dem zu durchsuchenden String brauche?

das heißt zum Beispiel:

String: (abc:1)(bcd:123test)(cde:ergebnis3)

Ich weiß jetzt das die Informationen die ich Suche immer in einer Zeile stehen, in klammern, hinter einem Doppelpunkt. Ich weiß aber nicht wie viele Blöcke es gibt... Der String ist jetzt völlig aus der Luft gegriffen, aber passt gerade.

mein ziel sind also die informationen: 1, 123test und ergebnis3

Ich muss dazu sagen, dass ich bisher noch keine möglichkeit gefunden habe...

Verfasst: Sonntag 26. April 2009, 13:22
von yipyip
Suchst Du das hier?

Code: Alles auswählen

In [30]: s = ' (abc:1) (bcd: 123test)(cde:  ergebnis3)'

In [31]: s1 = s.split(')')

In [32]: s1
Out[32]: [' (abc:1', ' (bcd: 123test', '(cde:  ergebnis3', '']

In [33]: s2 = [c.split(':')[1].strip() for c in s1 if c]

In [34]: s2
Out[34]: ['1', '123test', 'ergebnis3']
:wink:
yipyip

Verfasst: Sonntag 26. April 2009, 13:51
von b.esser-wisser
Ich weiß jetzt das die Informationen die ich Suche immer in einer Zeile stehen, in klammern, hinter einem Doppelpunkt. Ich weiß aber nicht wie viele Blöcke es gibt... Der String ist jetzt völlig aus der Luft gegriffen, aber passt gerade.
re's können das auch ;)

Code: Alles auswählen

import re
test = re.compile(
r"""(?x)   # "lesbare" RegEx
 \(        # in Klammern
  [^:]*    # Beliebige Zeichen vor...
  :        # dem Doppelpunkt
#  \s*      # Falls die Leerzeichen weg sollen...
  (        # Die gesuchte Information:
   .*?     # alles bis zur Klammer
  )        # (als Gruppe)
 \)
""")
s = ' (abc:1) (bcd: 123test)(cde:  ergebnis3)'
print test.findall(s)
hth, Jörg