Nova versão
O script que você postou realmente agrupa os e-mails por domínio, sem limite em número. Abaixo de uma versão que agrupará emails por domínio, mas divida a lista encontrada em partes arbitrárias. Cada pedaço será impresso em uma linha, começando com o domínio correspondente.
O script
#!/usr/bin/env python3
from operator import itemgetter
from itertools import groupby, islice
import os
import sys
dr = sys.argv[1]
size = 3
def chunk(it, size):
it = iter(it); return iter(lambda: tuple(islice(it, size)), ())
for f in os.listdir(dr):
# list the files
with open(os.path.join(dr, "chunked_"+f), "wt") as report:
file = os.path.join(dr, f)
# create a list of email addresses and domains, sort by domain
lines = [[l.strip(), l.split("@")[-1].strip()] for l in open(file).readlines()]
lines.sort(key=itemgetter(1))
# group by domain, split into chunks
for domain, occurrence in groupby(lines, itemgetter(1)):
adr = list(chunk([s[0] for s in occurrence], size))
# write lines to output file
for a in adr:
report.write(domain+","+",".join(a)+"\n")
Para usar
- Copie o script em um arquivo vazio, salve-o como
chunked_list.py
-
Na seção principal, defina o tamanho do bloco:
size = 5
-
Execute o script com o diretório como argumento:
python3 /path/to/chunked_list.py /path/to/files
Em seguida, ele criará um arquivo editado de cada um dos arquivos, denominado
chunked_filename
, com os e-mails agrupados (em partes).
O que faz
O script recebe como entrada um diretório com arquivos como:
email1@domain1
email2@domain1
email3@domain2
email4@domain1
email5@domain1
email6@domain2
email7@domain1
email8@domain2
email9@domain1
email10@domain2
email11@domain1
De cada arquivo, ele cria uma cópia, como:
domain1,email1@domain1,email2@domain1,email4@domain1
domain1,email5@domain1,email7@domain1,email9@domain1
domain1,email11@domain1
domain2,email3@domain2,email6@domain2,email8@domain2
domain2,email10@domain2
(definir cunksize = 3)