2016-05-24 12 views
1

Hintergrund:Entfernen von Objekten aus einer Liste in Python folgende Gültigkeitsprüfung

Ich bin ein kleines Skript zu schreiben, das als eines seines Arguments erfordert, eine E-Mail-Adressliste in einer Datei. Das Skript wird sie weiter verwenden, um die E-Mail-Adresse über eine Telnet-Verbindung zu einem SMTP-Server zu verwenden, so dass sie syntaktisch gültig sein müssen; folglich habe ich eine Funktion legen Sie die E-Mail-Adresse Gültigkeit zu überprüfen (übrigens diese regex nicht perfekt sein kann, ist aber nicht im Mittelpunkt der Frage, bitte Geduld mit mir Wird wahrscheinlich gelockert werden.):

def checkmailsyntax(email): 
    match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', email) 

    if match == None: 
     return True 

die main() Programm geht auf die Eingabedatei als Argument zu lesen (in argparse) und legen sie sie in einem (derzeit global) Liste:

with open(args.targetfile) as targets: 
    target_email_list = targets.readlines() 

ich es dachte wäre toll für das Skript ein automatisch löschen E-Mail-Adresse aus der Liste (anstatt nur zu sagen, es war falsch, was es zu tun war), wenn die checkmailsyntax-Funktion fehlgeschlagen ist. Diese gereinigte Liste könnte dann weitergehen zu syntaktisch gültigen E-Mail-Adressen an den SMTP-Server senden:

for i in target_email_list: 
    if checkmailsyntax(i): 
     target_email_list.remove(i) 

Fehlercode überprüft, die ich eingeordnet habe, sowohl vor als auch nach dem Löschelement Schnipsel zu sehen, ob es es Arbeit tun hat ist:

for i in target_email_list: 
    print i 

Das Problem: die Ausgabe des Codes ist also:

Vor Löschelement snippet (und den gesamten Inhalt der Datei eingereicht):

[email protected] 
[email protected] 
[email protected] 
noemail.com 
incorrectemail.com 
[email protected] 
pretendemail.com 
wrongemail.com 
[email protected] 
badlywrong.com 
[email protected] 

Nach Element löschen Schnipsel:

[email protected] 
[email protected] 
[email protected] 
incorrectemail.com 
[email protected] 
wrongemail.com 
[email protected] 
[email protected] 

Also ich ziemlich ratlos bin, warum 'noemail.com', 'pretendemail.com' und 'badlywrong.com' entfernt wurden und noch 'incorrectemail.com' und 'wrongemail.com' nicht. Es tritt auf, wenn in der Datei nacheinander zwei syntaktisch falsche E-Mails vorhanden sind.

Kann mir jemand in die richtige Richtung zeigen?

+0

Ah ja, es ist wahrscheinlich ein Duplikat. Ich wusste nicht, wonach ich suchte. Danke Bhargav. – Ian

Antwort

3

Es ist, weil Sie Elemente aus der Liste zu entfernen, während sie über sie iterieren:

for i in target_email_list: 
    if checkmailsyntax(i): 
     target_email_list.remove(i) # here 

Da sind folgende Werte zusammen:

pretendemail.com 
wrongemail.com 

Sobald Sie pretendemail.com E-Mail entfernen, wird die nächste wrongemail.com verschiebt sich und der Iterator denkt, dass dies iteriert wurde. Das Element, das als nächstes kommt, ist [email protected] und wrongemail.com wird nie auf gültige Syntax geprüft. Sie können einfach print(i) hinzufügen, bevor Sie die Syntax überprüfen und selbst sehen.

können Sie Liste Verständnis für diesen Zweck verwenden:

valid_emails = [email for email in target_email_list if checkmailsyntax(email)] 
+1

So einfach ist das. Im aktuellen Code gibt valid_emails mir alle ungültigen; Ich habe das sortiert, indem ich das '== None' aus der checkmailsyntax-Funktion entfernt habe, so dass es True zurückgibt, wenn eine Übereinstimmung gefunden wurde. Vielen Dank! – Ian

0

Antwort des AKS hat für Sie: Sie aus der Liste nicht entfernen, die Sie iterieren!Für eine schnelle Lösung, können Sie aus der aktuellen Liste entfernen, während Sie über eine Kopie iterieren:

Verwandte Themen