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.
#!/usr/bin/python
call_from=67553434634646346346
datei = open("/etc/capisuite/banned_caller.conf", "r")
x = datei.read().split()
print x #zu testen was drinnesteht.
for zeile in x:
if zeile == str(call_from):
print "treffer"
break
else:
print "nix"
datei.close()
drauf gekommen das es str(variableirgendwas) heißen muß
Bin ich als ich mal die variable und call_from im skript zusammen rechnen lassen wollte.Da kam dann das
fritzbox:~# ./test
['12', '67', '13', '67', '76']
12
67
Traceback (most recent call last):
File "./test", line 19, in <module>
r=zeile+call_from
TypeError: cannot concatenate 'str' and 'int' objects
fritzbox:~#
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# wieso nicht gleich als String, wenn es schon fix im Code steht?
call_from = "67553434634646346346"
# mapper für die Ausgabe als Dictionary
ouput = {
True: "treffer",
False: "nix"
}
# es kann ein IOError auftreten, also fangen wir den mal ab
try:
# mit with wird die Datei auf jeden Fall geschlossen
with open(r"/etc/capisuite/banned_caller.conf", "r") as in_file:
# für Anfänger sicher tricky:
# any(iterable) -> einmal True -> insgesamt True
# danach eine list comprehension
# in_file.readlines() iteriert über jede Zeile der Datei
# anstelle von zeile generieren wir eine Liste von Trues, WENN
# die Bedingung am Schluss erfüllt ist (kann ja mehrfach vorkommen)
# state = any([True for zeile in in_file.readlines() if zeile==call_from])
# Ok, hier die richtige und konzeptuell bessere Variante von BlackJack
state = any(call_from == line.strip() for line in in_file)
except IOError, e:
print e
else:
# Je nach Wert von State wird der entsprechende Wert des Dicts ausgegeben.
print output[state]
Zuletzt geändert von Hyperion am Dienstag 12. Januar 2010, 23:27, insgesamt 1-mal geändert.
Mir stellt sich irgendwie die Frage, warum Du überhaupt eine Zahl verwendest. Du könntest die Telefonnummer auch gleich als Zeichenkette schreiben, denn letztendlich sind Telefonnummern auch keine Zahlen. Niemand rechnet damit -- es macht keinen Sinn sie zu addieren, zu dividieren, oder 19% Mehrwertsteuer von einer Telefonnummer zu berechnen.
Und dann ginge auch der einfache ``in``-Test statt einer Schleife.
@Hyperion: WTF!? Mal abgesehen vom einfacheren Test mit ``in`` klappt das schonmal so nicht weil die Zeilen in der Datei mit einem Zeilenende-Zeichen enden, also nicht gleich einer Telefonnummer ohne dieses sein werden. Und dann ist das Argument von `any()` viel zu umständlich. Eine "list comprehension" statt eines Generatorausdrucks, `readlines()` statt über das Dateiobjekt iterieren, literales `True` und angehängte ``if``-Bedingung statt *vorne* einfach *nur* die Bedingung. Also: ``any(call_from == line.strip() for line in in_file)``
BlackJack hat geschrieben:@Hyperion: WTF!? Mal abgesehen vom einfacheren Test mit ``in`` klappt das schonmal so nicht weil die Zeilen in der Datei mit einem Zeilenende-Zeichen enden, also nicht gleich einer Telefonnummer ohne dieses sein werden. Und dann ist das Argument von `any()` viel zu umständlich. Eine "list comprehension" statt eines Generatorausdrucks, `readlines()` statt über das Dateiobjekt iterieren, literales `True` und angehängte ``if``-Bedingung statt *vorne* einfach *nur* die Bedingung. Also: ``any(call_from == line.strip() for line in in_file)``
BlackJack hat geschrieben:Mir stellt sich irgendwie die Frage, warum Du überhaupt eine Zahl verwendest. Du könntest die Telefonnummer auch gleich als Zeichenkette schreiben, denn letztendlich sind Telefonnummern auch keine Zahlen.
Insbesondere, da bei Telefonnummern fuehrende Nullen wichtig sind.