邮件自动化是一个Python脚本,通常被称为“邮件合并生成器”,但我更喜欢称其为邮件自动化,所以在文章中我将使用这个名称。
这篇文章非常适合初学者,我们将做的是获取我们的信件模板,并将[name]
替换为每个名字,为每个名字创建一封新邮件。
这是我们的目录、文件夹和我们将在本文中使用的起始文件。
/Main_Folder/
├── main.py <-- 我们在这里
├── Input
│ ├── Letters
│ │ └── letter_template.txt <-- 我们需要获取这个文件
│ └── Names
│ └── invited_names.txt <-- 以及这个文件
└── Output
让我们从基本逻辑开始:
1.打开 letter_template.txt
和 invited_names.txt
2.读取文件
3.循环遍历 invited_names.txt
文件中的名字 a. 获取内容 b. 用 name
替换 [name]
c. 为每封信写入输出
现在让我们更详细地了解这些步骤。
1. 打开文件:
├── main.py <-- 我们在这里
├── Input
│ ├── Letters
│ │ └── letter_template.txt <-- 我们需要获取这个文件
│ └── Names
│ └── invited_names.txt <-- 还有这个文件
└── Output
# 打开 letter_template 文件
with open("Input/Letters/letter_template.txt") as letter_file:
# 打开名字文件
with open("Input/Names/invited_names.txt") as name_file:
2. 读取文件:
- 首先从
letter_template
文件开始。
我们知道读取文件时使用 read()
方法。
以下是文章《》的一部分的中文翻译:
with open("Input/Letters/letter_template.txt") as letter_file:
letter_content = letter_file.read()
- 接下来是名字文件:
我们不能使用read()
方法来读取名字,因为它会返回一个大字符串,而我们并不想要那样。
我们需要的是一个list
类型的名字,以便我们可以进行循环处理。
所以我们需要使用 readlines()
方法,而不是 read()
方法:
with open("Input/Names/invited_names.txt") as name_file:
names = name_file.readlines()
如果你打印出 names
,结果将是:
with open("Input/Names/invited_names.txt") as name_file:
names = name_file.readlines()
print(names)
# ['Alice\n', 'Bob\n', 'Charlie\n', 'Diana\n', 'Ethan\n', 'Fiona\n', 'Greg\n', 'Hannah\n']
在我们进行下一步并遍历名称之前,让我们在 main.py
的顶部创建一个 constant
来表示 [name]
:
PLACEHOLDER = "[name]"
3. 遍历名称:
基本上,我们需要做的是获取信件内容,并用每个名称替换 PLACEHOLDER ([name])
:
with open("Input/Names/invited_names.txt") as name_file:
names = name_file.readlines()
for name in names:
new_letter = letter_content.replace(PLACEHOLDER, name)
现在如果你打印出 new_letter
,结果可能看起来有点奇怪:
你好,Fiona
,
我们写信正式邀请您参加我们的年度年终庆祝活动。
你好,Ethan
,
我们写信正式邀请您参加我们的年度年终庆祝活动。
你看到了吗?每个名字后面都有换行,这是因为 readlines()
方法的原因。
如您所见,每个名字后面都有换行符 \n
,我们需要使用 strip()
方法去掉它,也就是说我们需要先清理这些单词:
cleaned_word = name.strip()
with open("Input/Names/invited_names.txt") as name_file:
names = name_file.readlines()
for name in names:
cleaned_name = name.strip()
new_letter = letter_content.replace(PLACEHOLDER, cleaned_name)
4.最后一步是为每个名字打印出一封新的单独信件:
在我们的循环中,我们需要进入 Output
文件夹并在那里写入新的信件。
├── main.py
├── Input
│ ├── Letters
│ │ └── letter_template.txt
│ └── Names
│ └── invited_names.txt
└── 输出 <-- 我们需要在这个文件夹内创建新的字母
为了写入文件,我们需要切换到 w
(写入)模式:
with open(f"Output/ReadyToSend/letter_for_{cleaned_name}.txt", "w") as output:
output.write(new_letter)
现在如果你运行你的代码,你会在Output
文件夹中看到每个名字的新信件
├── main.py
├── Input
│ ├── Letters
│ │ └── letter_template.txt
│ └── Names
│ └── invited_names.txt
├── Output
├── ReadyToSend
└── letter_for_Alice.txt
└── letter_for_Bob.txt
└── letter_for_Charlie.txt
└── 以及其他
这是完整的代码片段:
PLACEHOLDER = "[name]"
with open("Input/Letters/letter_template.txt") as letter_file:
letter_content = letter_file.read()
with open("Input/Names/invited_names.txt") as name_file:
names = name_file.readlines()
for name in names:
cleaned_name = name.strip()
在这段代码中,首先使用 `with open(“Input/Letters/letter_template.txt”) as letter_file:` 语句打开一个名为 `letter_template.txt` 的文件,并将其内容读取到 `letter_content` 变量中。接着,使用 `with open(“Input/Names/invited_names.txt”) as name_file:` 语句打开另一个名为 `invited_names.txt` 的文件,并将文件中的每一行读取到 `names` 列表中。然后,通过 `for name in names:` 循环遍历 `names` 列表中的每个名字,并使用 `strip()` 方法去除名字前后的空白字符,结果存储在 `cleaned_name` 变量中。
new_letter = letter_content.replace(PLACEHOLDER, cleaned_name)
with open(f"Output/ReadyToSend/letter_for_{cleaned_name}.txt", "w") as output:
output.write(new_letter)
注意:
我们也可以像这样将读取步骤合并:
# 将两个文件的读取合并为一个块
with open("Input/Letters/letter_template.txt") as letter_file, \
open("Input/Names/invited_names.txt") as name_file:
letter_content = letter_file.read()
names = name_file.readlines()
with open("Input/Letters/letter_template.txt") as letter_file, \
open("Input/Names/invited_names.txt") as name_file:
letter_content = letter_file.read()
names = name_file.readlines()
for name in names:
cleaned_name = name.strip()
new_letter = letter_content.replace(PLACEHOLDER, cleaned_name)
with open(f"Output/ReadyToSend/letter_for_{cleaned_name}.txt", "w") as output:
output.write(new_letter)