2016-12-02 7 views
0

Ich habe ein Skript, das alle E-Mail-Adressen aus einem .txt-Dokument exportiert und alle E-Mail-Adressen ausdruckt. Ich möchte dies list.txt speichern, und wenn möglich, Duplikate löschen, aber es wird der FehlerDruckausgabe als .txt speichern

Traceback (most recent call last): 
    File "mail.py", line 44, in <module> 
    notepad.write(email.read()) 
AttributeError: 'str' object has no attribute 'read' 

Script geben:

from optparse import OptionParser 
import os.path 
import re 

regex = re.compile(("([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`" 
        "{|}~-]+)*(@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(\.|" 
        "\sdot\s))+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)")) 

def file_to_str(filename): 
    """Returns the contents of filename as a string.""" 
    with open(filename) as f: 
     return f.read().lower() # Case is lowered to prevent regex mismatches. 

def get_emails(s): 
    """Returns an iterator of matched emails found in string s.""" 
    # Removing lines that start with '//' because the regular expression 
    # mistakenly matches patterns like 'http://[email protected]' as '//[email protected]'. 
    return (email[0] for email in re.findall(regex, s) if not  email[0].startswith('//')) 

if __name__ == '__main__': 
    parser = OptionParser(usage="Usage: python %prog [FILE]...") 
    # No options added yet. Add them here if you ever need them. 
    options, args = parser.parse_args() 

    if not args: 
     parser.print_usage() 
     exit(1) 

    for arg in args: 
     if os.path.isfile(arg): 
      for email in get_emails(file_to_str(arg)): 
       #print email 
       notepad = open("list.txt","wb") 
       notepad.write(email.read()) 
       notepad.close() 

     else: 
      print '"{}" is not a file.'.format(arg) 
      parser.print_usage() 
+3

Try this: 'notepad.write (E-Mail)'. Einfach per E-Mail ohne .read() – neverwalkaloner

+0

Wie @newalkaloner schrieb, entferne '.read()' aus 'email.read()'. Um Duplikate zu entfernen, können Sie außerdem den zurückgegebenen Wert von "get_emails" in einen Satz mit 'für E-Mail im Satz (get_emails (file_to_str (arg))) konvertieren:'. – internetional

+1

Wenn ich .read() lösche, zeigt es nur 1 E-Mail-Adresse in list.txt, wenn ich Print-E-Mail verwende, zeigt ein paar hundert. Beim Aktualisieren der list.txt während der Extraktion ist die E-Mail-Adresse geändert, aber es wird nur 1 angezeigt. –

Antwort

0

When I remove .read() it shows only 1 email adres in list.txt when I use print email is shows a couple of hundred. when refreshing the list.txt while the extraction is busy the email adres change's but it only shows 1.

Dies liegt daran, Sie haben open() und close() innerhalb der Schleife, d.h. e. Die Datei wird für jede email neu geschrieben, und Sie haben nur die letzte geschriebene Adresszeile. Ändern Sie die Schleife:

  notepad = open("list.txt", "wb") 
      for email in get_emails(file_to_str(arg)): 
       #print email 
       notepad.write(email) 
      notepad.close() 

oder noch besser:

  with open("list.txt", "wb") as notepad: 
       for email in get_emails(file_to_str(arg)): 
       #print email 
       notepad.write(email)