Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python邮件合并项目中的空白数据字段_Python_Mailmerge - Fatal编程技术网

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

我只是想尝试用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
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)