Python подсчитывает электронные письма в текстовом файле

#python #algorithm #count

Вопрос:

У меня есть текстовый файл, содержащий электронные письма и идентификаторы, он выглядит примерно так:

 mark@gmail.com:1111111
matt@hotmail.com:12313
harry@gmail.com:121213
matthew@hotmail.com:12313
tom@yahoo.com:123113
 

Что я хочу сделать, так это создать код, чтобы подсчитать, сколько раз возникало электронное письмо, и перечислить их для меня.
Например:

 @hotmail.com : 2
@gmail.com : 2
@yahoo.com : 1
 

Я создал код, который учитывает электронные письма, но он также учитывает их имя и идентификатор, которые мне не нужны

Вот код:

 import string
  
# Open the file in read mode
text = open("sample.txt", "r")
  
# Create an empty dictionary
d = dict()
  
# Loop through each line of the file
for line in text:
    # Remove the leading spaces and newline character
    line = line.strip()
  
    # Convert the characters in line to 
    # lowercase to avoid case mismatch
    line = line.lower()
  
    # Put a space behind @ and remove : with a space
    line = line.replace("@", " @")
    line = line.replace(":", " ")
  
    # Split the line into words
    words = line.split(" ")
    
    # Iterate over each word in line
    for word in words:
        
        # Check if the word is already in dictionary
        if word in d:
            # Increment count of word by 1
            d[word] = d[word]   1
        else:
            # Add the word to dictionary with count 1
            d[word] = 1
  
# Print the contents of dictionary
for key in list(d.keys()):
    print(key, ":", d[key])
 

Тогда результат будет выглядеть следующим образом:

 mark : 1
@gmail.com : 2
1111111 : 1
matt : 1
@hotmail.com : 2
12313 : 2
harry : 1
121213 : 1
matthew : 1
tom : 1
@yahoo.com : 1
123113 : 1
 

Есть ли способ заставить считать только строки, начинающиеся с @?

Я очень новичок в python, поэтому ценю любую помощь! Спасибо

Ответ №1:

Вот простая альтернатива с использованием collections.Counter() :

 from collections import Counter

with open('sample.txt') as f:
    c = Counter([_.strip().split('@')[1].split(':')[0].lower() for _ in f])

print(c)
 

Приведенный выше код приведет к чему-то вроде этого:

 Counter({'gmail.com': 2, 'hotmail.com': 2, 'yahoo.com': 1})
 

Ответ №2:

Вот код.

line=line.strip("n").split(":")[0] это основная линия. В нем говорится, что сначала разденьте "n" персонажа, затем разделите его : и возьмите первую часть.

 from collections import Counter
with open("z.txt","r ") as file:
    email=[]
    read_lines=file.readlines()
    for line in read_lines:
        line=line.strip("n").split(":")[0]
        x=line.index("@")
        email.append(line[x:])
mail_servers=dict(Counter(email))
print("------ Search Found ------n")
for key,value in mail_servers.items():
    print(key,":",value)

 

Выход:

 ------ Search Found ------

@gmail.com : 2
@hotmail.com : 2
@yahoo.com : 1
 

Ответ №3:

Хотите ли вы рассчитывать в отношении доменного имени (hotmail, yahoo, gmail и т.д.)? Например, сколько парней используют gmail или hotmail в качестве своей электронной почты и т. Д… В этом случае вы можете использовать следующий код:

 dict_count = {}
domain_list = []
for element in lista:
    res = re.findall(r'@w .w ', element) 
    domain_list.append(res)
domain_list = [item for sublist in t for item in sublist]
for item in domain_list:
    if item not in dict_count:
        dict_count[item] = 1
    else:
        dict_count[item]  = 1
print(dict_count)
 

Большое спасибо
Ваши отзывы будут оценены по достоинству.

 P.S. Here is the output:
{'@gmail.com': 2, '@hotmail.com': 2, '@yahoo.com': 1}
 

Ответ №4:

Способ решить эту проблему-добавить цикл for, чтобы просмотреть каждую строку текста и определить, есть ли в ней электронное письмо со словом @ и идентификатором, если в нем есть точка с запятой или цифры (если в электронных письмах нет цифр). Вот код.

 # replace this
# Loop through each line of the file
for line in text:
    # Remove the leading spaces and newline character
    line = line.strip()
 
 # with this
 
 # Loop through each line of the file
for line in text:
    if "@" in Email:
        line == Email
    else:
        line == ID
 

И внутри вашего файла .txt вы можете указать им атрибут с именем Email для электронной почты и ID для идентификатора.
Например, следующее:

 Email: Email@gmail.com
ID: ID
 

или что-то в этом роде.
РАСКРЫТИЕ ИНФОРМАЦИИ: Если есть что-то еще, что не является идентификатором или электронной почтой, код может не сработать.

Редактировать: Я имел в виду, что, как и в текстовом тексте, который я упомянул, не сработает, сделайте это сами, потому что я не знаю, как это сделать.