Bestimmten Wert aus Datei auslesen

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.
Antworten
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

In [1]: 'foo' in 'foobar'
Out[1]: True
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.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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.
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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?
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.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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]
bankkind
User
Beiträge: 106
Registriert: Freitag 14. September 2007, 23:02
Wohnort: Teltow
Kontaktdaten:

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...
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Antworten