Anrufe aus einer Liste.Auf den AB schalten!Anfanger

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.
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

Code: Alles auswählen

#!/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()
fritzbox:~# echo "67553434634646346346" >> /etc/capisuite/banned_caller.conf
fritzbox:~# ./test
['12', '67', '13', '67', '76', '67553434634646346346']
nix
nix
nix
nix
nix
treffer
fritzbox:~#
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:~#
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ungetestet:

Code: Alles auswählen

#!/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.
BlackJack

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

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

call_from = "67553434634646346346"

ouput = {
    True: "treffer",
    False: "nix"
}

try:
    with open(r"/etc/capisuite/banned_caller.conf", "r") as in_file:
        # so gehts ja noch einfacher :-)
        print output[call_from in in_file.read().split()]
except IOError, e:
    print e
Zuletzt geändert von Hyperion am Dienstag 12. Januar 2010, 23:25, insgesamt 1-mal geändert.
BlackJack

@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)``
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

BlackJack hat geschrieben:Und dann ginge auch der einfache ``in``-Test statt einer Schleife.
@Hyperion: Ich glaube er meint ``if call_from in in_file.read()``, oder?

Edit: Meinte er doch nicht :D
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)``
*seufz* Ich sollte dringend ins Bett gehen :oops:
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

Code: Alles auswählen

import capisuite,cs_helpers
my_path="/root/capisuite-examples/"

def callIncoming(call,service,call_from,call_to):
        try:
                if (call_to=="meineMSN"):
			datei = open("/etc/capisuite/banned_caller.conf", "r")
			x = datei.read().split()
			print "es ruft", call_from
			print x #zu testen was drinnesteht.
			for zeile in x:
				if zeile == str(call_from):
#	                        	filename=cs_helpers.uniqueName(my_path,"voice","la")
#                        		capisuite.connect_voice(call,1)
#					capisuite.audio_send(call,my_path+"announce.la")
#					capisuite.audio_send(call,my_path+"beep.la")
#                        		capisuite.audio_receive(call,filename,20,3)
#                        		capisuite.disconnect(call)
					print "treffer"
					break
				else:
					print "nix"
			datei.close()
		else:
                        capisuite.reject(call,1)
        except capisuite.CallGoneError:
                capisuite.disconnect(call)
geht aber ich kriege
fritzbox:~# capisuite -c /root/capisuite.conf
es ruftxxxxxxxxx
['12', '67', '13', '67', '76', '67553434634646346346', '67553434634646346346']
nix
nix
nix
nix
nix
nix
nix
Speicherzugriffsfehler
fritzbox:~# pidof capisuite
fritzbox:~#
danach ist capiuite aus.

wie verhindert mann den Speicherzugriffsfehler und woher kommt er?
kabu
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:54

scheit aber wenn ich das normal über das system laufen lasse zu gehen.

Ich probier das mal so ein Zeit lang und fülle langsam mal die blacklist.

Code: Alles auswählen

import capisuite,cs_helpers
my_path="/root/capisuite-examples/"

def callIncoming(call,service,call_from,call_to):
        try:
                if (call_to=="123456"): #<Hier die MSN (eigende nummer) eintragen
			datei = open("/etc/capisuite/banned_caller.conf", "r")
			x = datei.read().split()
#			print "es ruft", call_from
			print x #zu testen was drinnesteht.
			for zeile in x:
				if zeile == str(call_from):
	                        	filename=cs_helpers.uniqueName(my_path,"voice","la")
                        		capisuite.connect_voice(call,1)
#					capisuite.audio_send(call,my_path+"announce.la")
					capisuite.audio_send(call,my_path+"beep.la")
                        		capisuite.audio_receive(call,filename,20,3)
                        		capisuite.disconnect(call)
					break
			datei.close()
		else:
                        capisuite.reject(call,1)
        except capisuite.CallGoneError:
               capisuite.disconnect(call)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten