Скорее всего, проблема в том, что в вашем файле .csv
есть повторные пользователи / электронные письма. Возможно, вам следует немного лучше структурировать свой код, чтобы легче было его отлаживать.
По сути, вы хотите убедиться, что вы разъединяете функциональные возможности, чтобы вы могли тестировать каждый из них по отдельности, так что сценарии, такие какэтого не происходит. В качестве примера возьмем следующее:
import pandas as pd
class User:
def __init__(self, email, name, price):
self.email = email
self.name = name
self.price = price
def send_email_to_user(self):
""" Sends email to the user. """
SendEmail.send_email(self)
def __eq__(self, other):
""" Checks the equality of User by the standard == notation. """
if (
self.email == other.email
and self.name == self.name
and self.price == self.price
):
return True
else:
return False
class SendEmail:
@staticmethod
def create_message(user):
""" Creates the message template to be sent. """
return f"<b>{user.name}: {user.email} for {user.price}</b>"
@staticmethod
def send_email(user):
""" Sends email to passed user. """
name = user.name
email = user.email
price = user.price
message = SendEmail.create_message(user)
print(f"Sending the message {message} to the user.")
data = {
"name": ["name1", "name2", "name1", "name3"],
"email": ["email1", "email2", "email1", "email3"],
"price": ["$1", "$2", "$1", "$3"],
}
df = pd.DataFrame(data)
users = []
for name, email, price in zip(df.name, df.email, df.price):
user = User(name, email, price)
# We are using the __eq__ method here when we do "user not in users".
if user not in users:
users.append(user)
else:
print(
f"It seems the user with the name {name} is already in the list of users."
)
for user in users:
user.send_email_to_user()
Выше выводов:
It seems the user with the name name1 is already in the list of users.
Sending the message <b>email1: name1 for $1</b> to the user.
Sending the message <b>email2: name2 for $2</b> to the user.
Sending the message <b>email3: name3 for $3</b> to the user.
Обратите внимание, как приведенный выше код разъединяет наши функциональные возможности. Таким образом, мы можем легче проверить, можем ли мы отправлять и шаблонировать электронные письма (через объект SendEmail
), и, конечно, в конечном итоге, отправлять электронную почту пользователям через класс Users
.