2010-01-05 5 views
1

J'ai deux longue liste, l'un à partir d'un fichier journal qui contient des lignes formatées commeComment obtenir la différence entre deux listes en fonction des sous-chaînes withing chaque chaîne dans les listes séparées

201001050843 blah blah blah <[email protected]> blah blah

et un second fichier en format csv. J'ai besoin de générer une liste de toutes les entrées dans le fichier 2 qui ne contiennent pas d'adresse e-mail dans le fichier journal, tout en conservant le format csv.

Exemple
fichier journal contient:

201001050843 blah blah blah <[email protected]> blah blah 
201001050843 blah blah blah <[email protected]> blah blah 

Fichier2 contient:

156456,bob,sagget,[email protected],4564456 
156464,bob,otherguy,[email protected],45644562 

la sortie doit être:

156464,bob,otherguy,[email protected],45644562 

Actuellement je prends les e-mails du journal et la charge dans une autre liste avec:

sent_emails =[] 
for line in sent: 
    try: 
     temp1= line.index('<') 
     temp2 = line.index('>') 
     sent_emails.append(line[temp1+1:temp2]) 
    except ValueError: 
     pass 

Et puis comparer à file2 avec soit:

lista = mail_lista.readlines() 
for line in lista: 
    temp = line.split() 
    for thing in temp: 
     try: 
      if thing.index('@'): 
       if thing in sent_emails: 
        lista.remove(temp) 
     except ValueError: 
      pass 
newa.writelines(lista) 

ou:

for line in mail_listb: 
    temp = line.split() 
    for thing in temp: 
     try: 
      if thing.index('@'): 
       if thing not in sent_emails: 
        newb.write(line) 
     except ValueError: 
      pass 

Toutefois, les deux reviennent tous fichier2!

Merci pour toute aide que vous pouvez donner. Merci pour les recommandations pour les ensembles, il a fait une différence de vitesse plus grande que j'aurais pensé possible. Manière d'aller des tables de hachage! J'utiliserai plus souvent des décors à partir de maintenant.

Répondre

1

Vous pouvez créer l'ensemble des e-mails comme vous le faites, puis:

# emails is a set of emails 
for line in fileinput.input("csvfile.csv",inplace =1): 
    parts = line.split(',') 
    if parts[3] not in emails: 
     print line 

Cela ne fonctionne que si l'e-mail dans le fichier CSV est toujours à la position 4.

fileinput en place permet l'édition .

Et d'utiliser un ensemble pour les courriels au lieu d'une liste comme Aaron l'a dit, non seulement en raison de la rapidité, mais aussi pour éliminer les doublons.

+0

parfait, même si mon problème était en fait une faute de frappe signalée par Aaron Digulla, cela répond à la question que j'ai posée d'une manière très claire, et m'a appris quelque chose. – Chance

1

line.split() se sépare en espaces blancs. Utilisez line.split(',') à la place.

Aussi: L'ordre des lignes est-il important? Si non, alors vous devriez vraiment utiliser un set() au lieu d'une liste. Cela rendra le code beaucoup plus rapide.

+0

* facepalm * Ne peut pas croire que j'ai raté! – Chance

+0

Maintenant, mon code fonctionne, quelques heures après que je disais "Je vais écrire un script rapide" Merci de me sauver de moi-même! – Chance

0

Voici une autre façon, avec une vérification minimaliste de la position de l'adresse email.

import fileinput 
emails=[] 
for line in open("file1"): 
    start=line.find("<") 
    end=line.find(">") 
    if start != -1 and end !=-1: 
     emails.append(line[start+1:end]) 

for line in fileinput.FileInput("file2",inplace=1): 
    p = line.split(",") 
    for item in p: 
     if "@" in item and item not in emails: 
      print line.strip() 

sortie

$ ./python.py 
156464,bob,otherguy,[email protected],45644562 
Questions connexes