python mailmerge项目中的空白数据字段

问题描述

我只是想尝试在 python 中创建一个简单的邮件合并应用程序。所以我有两个文本文件一个是名字,另一个有地方。 名称是:

Aang
Zuko
Appa
Katara
Sokka
Momo
Uncle Iroh
Toph
Brian
Toby
Donna
Petra Verkaik
Ava Price

在另一个文件名invited_places.txt中。我有以下几点:

Bristol
London
Plymouth
Cardiff
Swansea
Glasgow
Belfast
Twickenham
New York
New Orleans
Paris
Bridgend
Manchester

为了让这更生动,这就是我写的。

PLACEHOLDER = "[name]"
ADDRESS = "[place]"
 
with open("./Input/Names/invited_names.txt") as names_files:
    names = names_files.readlines()
    # print(names)
with open("./Input/Places/invited_places.txt") as places_files:
    places = places_files.readlines()
    # print(places)
 
with open("./Input/Letters/starting_letter.txt") as letter_file:
    letter_contents = letter_file.read()
 
    for name in names:
        stripped_name = name.strip()
        new_letter = letter_contents.replace(PLACEHOLDER,stripped_name)
 
        for place in places:
            stripped_place = place.strip()
            new_letter = letter_contents.replace(ADDRESS,stripped_place)
            
        with open(f"./Output/ReadyToSend/letter_for_{stripped_name}.txt",mode="w") as completed_letter:
            completed_letter.write(new_letter)

不幸的是,当字母打印出来时,我只能得到地名。

亲爱的[姓名],

本周六邀请您参加我的生日。感谢您从曼彻斯特出发

希望你能成功!

布莱恩

不确定使用字典是否更好的解决方案。任何帮助将不胜感激。

解决方法

首先,您的所有收件人总是从曼彻斯特出发;这是因为您的地点列表会针对每个收件人姓名完整循环,并且文档会在循环后保存。

收件人姓名正在从地名切换,但是当您在第二个 for 循环中分配地址时,您使用的是原始字母模板而不是应用名称时修改的模板,{{1} 的分配} 替换为原来的 new_letter

这将通过交换解决:

letter_contents

new_letter = letter_contents.replace(ADDRESS,stripped_place)

您使用字典代替列表的想法很好。在处理了无数邮件合并项目之后,最困难和最必要的问题之一是确保所有客户端详细信息始终保持同步。我会为每个收件人分配一个唯一的 ID 来绑定数据。当你开始处理大数据集和大量字段时,将两个数据字段读入同一个键下的字典会更容易。

一个例子,使用 defaultDict

new_letter = new_letter.replace(ADDRESS,stripped_place)

如果可能的话,我会为您的源数据添加弹性,以使其难以混淆收件人信息的不同字段。事实上,如果在您的数据中途输入了一个空行,任何进一步的数据都会不同步。这可以通过使用一个带有逗号分隔值(或任何其他分隔符)的源数据文件来实现,或者在两个文本文件中使用一个分隔的收件人 ID 来确保客户记录始终保持同步。 Reading CSV files in Python