python邮件合并项目中的空白数据字段
我只是想尝试用python创建一个简单的邮件合并应用程序。所以我有两个文本文件。一个是名字,另一个有位置。 名单如下:python邮件合并项目中的空白数据字段,python,mailmerge,Python,Mailmerge,我只是想尝试用python创建一个简单的邮件合并应用程序。所以我有两个文本文件。一个是名字,另一个有位置。 名单如下: Aang Zuko Appa Katara Sokka Momo Uncle Iroh Toph Brian Toby Donna Petra Verkaik Ava Price 另一个文件名为invested_places.txt。我有以下资料: Bristol London Plymouth Cardiff Swansea Glasgow Belfast Twickenh
Aang
Zuko
Appa
Katara
Sokka
Momo
Uncle Iroh
Toph
Brian
Toby
Donna
Petra Verkaik
Ava Price
另一个文件名为invested_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循环中分配地址时,您使用的是原始信函模板,而不是应用名称时修改的模板,
新信函
的分配将替换为原始的信函内容
这将通过交换来解决:
新建字母=字母内容。替换(地址、位置)
与
新字母=新字母。替换(地址、位置)
你用字典代替列表的想法很好。在处理了无数邮件合并项目之后,最困难和必要的问题之一是确保所有客户机细节始终保持同步。我会给每个接收者分配一个唯一的ID来绑定数据。当您开始处理大数据集和大量字段时,在同一个键下将两个数据字段读入字典将更容易
例如,使用:
如果可能的话,我会给源数据添加弹性,以避免混淆收件人信息的不同字段。事实上,如果在数据的中途输入了一个空行,则任何进一步的数据都将不同步。这可以通过使用一个带有逗号分隔值(或任何其他分隔符)的源数据文件来实现,或者在两个文本文件中使用分隔的收件人ID来确保客户记录始终保持同步。
不幸的是,这不起作用,只创建了一个字母。很抱歉,它现在起作用了!
from collections import defaultdict
PLACEHOLDER = "[name]"
ADDRESS = "[place]"
fieldMapper = defaultdict(dict)
with open("invited_names.txt") as names_files:
names = names_files.readlines()
with open("invited_places.txt") as places_files:
places = places_files.readlines()
with open("starting_letter.txt") as letter_file:
letter_contents = letter_file.read()
docID = 0 # create a document ID
for name in names:
stripped_name = name.strip()
fieldMapper[docID]['name']=stripped_name
docID +=1
docID = 0
for place in places:
stripped_place = place.strip()
fieldMapper[docID]['address']=stripped_place
docID +=1
for document,fields in fieldMapper.items(): # run through each recipient / Doc ID in dictionary
new_letter = letter_contents.replace(ADDRESS, fields.get('address'))
new_letter = new_letter.replace(PLACEHOLDER, fields.get('name'))
with open(f"letter_for_{fields.get('name')}.txt",mode="w") as completed_letter:
completed_letter.write(new_letter)