【问题标题】:How do I output multiple files with DIFFERENT info?如何输出具有不同信息的多个文件?
【发布时间】:2025-12-31 16:00:10
【问题描述】:

我正在尝试从两个不同的文件中读取信息。第一个文件“数据库”是一个包含人名和关于这些人的不同部分信息的文件。每个人(和他们的信息)都用行与其他人分开。第二个文件“模板”是带有编号占位符的垃圾邮件模板。我的目标是将数据库的信息部分读入模板中编号的占位符,并为每个人(数据库中的 3 人)输出一个文件。因此,我应该有 3 个输出文件。

database = open("database", "r")

template = open("template", "r")

outfile1 = open("junk1", "w")

outfile2 = open("junk2", "w")

outfile3 = open("junk3", "w")

for line in database:
    part = line.split("|")
    title = part[0] #replaces #1
    firstname = part[1] #replaces #2
    lastname = part[2] #replaces #3
    address = part[3] #replaces #4
    city = part[4] #replaces #5
    state = part[5] #replaces #6
    zipcode = part[6] #replaces #7


for line in template:
    string = line

    for r in (("|1|",title),("|2|", firstname),("|3|", lastname),("|4|", address),("|5|", city),("|6|", state),("|7|", zipcode)):
        string = string.replace(*r)
    outfile1.write(string)
    outfile2.write(string)
    outfile3.write(string)          


outfile1.close()
outfile2.close()
outfile3.close()



database.close()
template.close()

我希望它输出到 3 个不同的文件。它目前输出 3 个文件,但每个模板输出仅包含最后一行的名称和信息。我需要第一个文件有模板填写第一人的信息,第二个文件包含第二个人的信息,第三个文件包含第三个人的信息。

【问题讨论】:

  • 你必须使用 for line, output in zip(database, [outfile1, outfile2, outfile2]) 并在这个 for 循环中运行模板
  • 你能澄清一下“在这个for循环中运行模板吗?”
  • 你可以使用字符串格式而不是replace() - "{0}, Hello {1}".format(title, firstname)
  • 为什么要更改替换部分?这似乎工作正常。我不确定您的建议是什么...似乎 outfile1.write(string) 的放置可能是问题所在,就好像它没有正确地遍历数据库行一样。
  • 它是 cmets 的地方 - 不是解决方案。在评论中,我们可以建议与问题无关的更改。

标签: python


【解决方案1】:

您可以使用zip() 从数据库和文件中获取数据,您必须在其中写入这些数据。

可能是这样的

database = open("database", "r")

# read all to memory to use it many times in `for` loop
template = list(open("template", "r"))

outfile1 = open("junk1", "w")
outfile2 = open("junk2", "w")
outfile3 = open("junk3", "w")

for line, output in zip(database, [outfile1, outfile2, outfile3]):
    part = line.split("|")
    title = part[0] #replaces #1
    firstname = part[1] #replaces #2
    lastname = part[2] #replaces #3
    address = part[3] #replaces #4
    city = part[4] #replaces #5
    state = part[5] #replaces #6
    zipcode = part[6] #replaces #7

    for string in template:
        for r in (("|1|", title),("|2|", firstname),("|3|", lastname),("|4|", address),("|5|", city),("|6|", state),("|7|", zipcode)):
           string = string.replace(*r)
        output.write(string)

outfile1.close()
outfile2.close()
outfile3.close()

使用zip(),您可以使用第一个文件从数据库中获取第一行,然后使用第一个数据填充模板并保存在第一个文件中,接下来您使用第二个文件从数据库中获取第二行,然后使用第二个数据填充模板并保存在第二个文件中文件等

【讨论】:

  • 好的...此代码输出与我的输出略有不同,但不太正确。它在第一个文件中创建正确的输出,但将第二个和第三个输出文件留空......
  • 现在我看到你直接从文件中读取模板,所以在第一次使用它后从文件末尾读取它并没有给出任何内容 - 你可以重新打开模板或在开始时将其读取到列表。
最近更新 更多