Nowość w Pythonie i utknął na tym!

Mam duży plik tekstowy tylko e-maili z różnych domen. Powiedz, że chcę wyciągnąć tylko Gmail i Hotmail.

Byłem w stanie z tym, ale wychodzi ze sobą wszystkie mieszane.

filename = input('Enter filename to open: ')
try:
    filename = open(filename)
except:
    print('File cannot be opened: ', filename)
exit()
import re
for line in filename:
    line = line.rstrip()
    x = re.findall('\S+@gmail.com',  line)
    if len(x) > 0:
        print(x)
    y = re.findall('\S+@hotmail.com',  line)
    if len(y) > 0:
        print(y)

Moim celem jest wydrukowanie wszystkich e-maili Gmail, a następnie wymieniono liczbę znalezionych adresów e-mail Gmail. Wtedy chciałbym wymienić wszystkie konta Hotmail i listę, ile znalezionych kont Hotmail. Ma sens?

1
Megatron 7 wrzesień 2017, 05:27

2 odpowiedzi

Najlepsza odpowiedź

@ Jaw jest absolutnie poprawny o problemie, że szukasz linii informatycznej według linii. Odkąd używasz re.findall, nie ma powodu, dlaczego musisz iterować przez linie. Wszystko, co musisz zrobić, to:

import re

filename = input('Enter filename to open: ')

try:
    file = open(filename)
except:
    print('File cannot be opened: ', filename)
    exit()

emails = file.read()
x = re.findall('\S+@gmail.com',  emails)
if len(x) > 0:
    print(x)
    # or print("\n".join(x)) for list-like printing 

y = re.findall('\S+@hotmail.com',  emails)
if len(y) > 0:
    print(y)
    # or print("\n".join(y)) for list-like printing
2
abccd 7 wrzesień 2017, 03:03

Zamiast drukować adresy podczas ich znajomości, zbierasz je na dwóch listach i wydrukuj listy na końcu:

gmail = []
hotmail = []

for line in filename: #filename is a BAD name for this variable
    address = re.findall('\S+@gmail.com', line)
    if address: gmail.extend(address)
    address = re.findall('\S+@hotmail.com', line)
    if address: hotmail.extend(address)

print(gmail)
print(hotmail)
-1
DYZ 7 wrzesień 2017, 03:22