如何使用来自csv的数据替换txt文件模板中的占位符?

时间:2018-06-07 23:13:42

标签: python csv

我有一个项目,我一直在为我的计算机科学课开设工作,我不太确定我在当前的实现中做错了什么。我应该从CSV中读取数据,其中包括虚构旅游公司的客户数据。然后我应该打开一个.txt文件模板并用CSV上的数据替换占位符(格式为[[placeholder]]),然后为每个客户保存一个新的txt文件并进行适当的替换。好像我正在向CSV中的每个客户发送一封新电子邮件。

我能够加载CSV并将CSV中的数据放入数组中,而CSV的标题(与占位符相同,不在双括号中)位于列表中:

file_obj = open(PATH_SAVE_DIR + csv_filename, newline='')
reader = csv.DictReader(file_obj)
headers = reader.fieldnames  # list of headers

file_obj.close()

customerdata = []
with open(PATH_SAVE_DIR + csv_filename, 'r') as inf:
    reader = csv.reader(inf)
    row = next(reader)
    for row in reader:
        customerdata.append(row)

这为我提供了以下数组,其中包含CSV中的数据:

[['James', 'Butt', '6649 N Blue Gum St', 'New Orleans', 'Orleans', 'LA', '70116', '504-621-8927', 'jbutt@gmail.com', 'gold'], ['Josephine', 'Darakjy', '4 B Blue Ridge Blvd', 'Brighton', 'Livingston', 'MI', '48116', '810-292-9388', 'josephine_darakjy@darakjy.org', 'silver'], ['Art', 'Venere', '8 W Cerritos Ave #54', 'Bridgeport', 'Gloucester', 'NJ', '8014', '856-636-8749', 'art@venere.org', 'bronze']]

我在理解正在发生的事情时遇到困难的部分是尝试用客户的数据替换txt文件的数据。我当前的代码能够替换文件中的数据,但它只使用第一组数据,并且似乎从未在数组中计算并使用下一个客户的数据:

file_obj = open(PATH_SAVE_DIR + EMAIL_TEMPLATE, 'r')
file_input = file_obj.read()

count = 0
for customer in range(len(customerdata)):
    customernumber = str(customer + 1)
    while count < len(customerdata):
        for word in headers:
            if word in file_input:
                index = headers.index(word)
                file_input = file_input.replace("[[" + word + "]]",
                                                customerdata[count][index])
        count += 1
    file_output = open(PATH_SAVE_DIR + EMAIL + customernumber + ".txt", 'w')
    file_output.write(file_input)
    file_output.close()


file_obj.close()

因此,它能够成功创建email1.txt,email2.txt和email3.txt,但所有这三个文件都是相同的,只包含第一个客户的替换数据。我尝试将print (count)放在我的for word in headers循环周围的不同位置,看起来它只与第一个客户一次运行那个特定的循环,然后再次尝试计数up(对于阵列中的下一个客户)。如何重复此循环为每个客户执行此操作?

我认为字符串替换也可以通过正则表达式替换来完成,但是我们还没有教过正则表达式,所以我仍然有点不清楚我将如何使用它们来实现它。

编辑:我能够提供一个正常工作的代码。仍然需要编辑一些格式,但至少它现在正在做我想要它做的事情。

file_obj = open(PATH_SAVE_DIR + EMAIL_TEMPLATE, 'r')
file_input = file_obj.read()
file_obj.close()
for customer in range(len(customerdata)):
    customernumber = str(customer + 1)
    for word in headers:
        if word in file_input:
            index = headers.index(word)
            replaced = file_input.replace("[[" + word + "]]",
                                          customerdata[customer][index])
            file_input = replaced
        with open(PATH_SAVE_DIR + EMAIL + customernumber + ".txt", 'w') \
        as file_output:
            file_output.write(replaced)
    with open(PATH_SAVE_DIR + EMAIL_TEMPLATE, 'r') as file_obj:
        file_input = file_obj.read()

1 个答案:

答案 0 :(得分:0)

问题是你有两个循环结构,你只需要一个。第一个是范围内的客户(len(customerdata)):,第二个是while count&lt; LEN(customerdata):.所以基本上你要两次循环所有客户。文件写入语句嵌入在一个循环中但不在另一个循环中,因此您的脚本正在从客户0,1,2读取数据,并将数据[2]写入文件,读取0,1,2和写入数据[2]到文件......这有帮助吗?

编辑:另一个问题是您要使用邮件覆盖模板,因此在第一次覆盖后它将停止作为模板运行。