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

2024-09-28 05:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,我一直在为我的计算机科学入门课工作,我不太确定我在当前的实现中做错了什么。我应该从CSV中读取数据,其中包括一家虚构的旅游公司的客户数据。然后,我应该打开一个.txt文件模板,用CSV上的数据替换占位符(格式为[[占位符]]),然后为每个客户保存一个新的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的数据:

^{pr2}$

当我试图用客户的数据替换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循环的不同位置,似乎它只对第一个客户运行一次特定的for循环,然后在计数增加的情况下不再尝试(对于数组中的下一个客户)。我怎样才能为每个客户重复这个循环呢?在

我想字符串替换也可以用正则表达式替换来完成,但是我们还没有学习正则表达式,所以我仍然有点不清楚如何使用这些来实现它。在

编辑:我能想出一个有效的代码。仍然需要编辑一些格式,但至少它现在正在做我想要它做的事情。在

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()

Tags: csv数据pathintxtobjinput客户
1条回答
网友
1楼 · 发布于 2024-09-28 05:25:30

问题是你有两个循环结构,而你只想要一个。第一个用于范围(len(customerdata)):,第二个是while count<;len(customerdata):。所以基本上你要对所有的顾客循环两次。file write语句嵌入在一个循环中,但不嵌入另一个循环中,因此脚本从客户0、1、2读取数据,并将数据[2]写入文件,读取0、1、2,然后将数据[2]写入文件。。。这有帮助吗?在

编辑:另一个问题是你用你的消息覆盖了你的模板,所以在第一次覆盖之后它就不再作为模板工作了。在

相关问题 更多 >

    热门问题