#python
#python
Вопрос:
Я пытаюсь прочитать информацию из двух разных файлов. Первый файл, «база данных», представляет собой файл, содержащий имена людей и различные части информации об этих людях. Каждый пользователь (и его информация) отделяется строкой от других пользователей. Второй файл, «template», представляет собой шаблон нежелательной почты с пронумерованными заполнителями. Моя цель — прочитать информационные части базы данных в пронумерованные заполнители в шаблоне и вывести файл для каждого пользователя (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 файла, но каждый вывод шаблона имеет имя и информацию только из последней строки. Мне нужно, чтобы в первом файле был шаблон с заполненной информацией первого пользователя, второй файл содержал информацию второго пользователя, третий файл содержал информацию третьего лица.
Комментарии:
1. вам пришлось бы использовать
for line, output in zip(database, [outfile1, outfile2, outfile2])
и запускать шаблон внутри этогоfor
цикла2. Можете ли вы уточнить «запустить шаблон внутри этого цикла for?»
3. вы могли бы использовать форматирование строки вместо
replace()
—"{0}, Hello {1}".format(title, firstname)
4. Зачем мне менять часть замены? Кажется, это работает нормально. Я не уверен, что вы предлагаете… Похоже, что проблема может заключаться в размещении outfile1.write(string), как будто он неправильно выполняет итерацию по строкам базы данных.
5. это место для комментариев, а не для решений. В комментарии мы можем предложить изменения, которые не имеют ничего общего с isuess.
Ответ №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()
вы получаете первую строку из базы данных с первым файлом и заполняете шаблон, используя первые данные, и сохраняете в первом файле, затем вы получаете вторую строку из базы данных со вторым файлом, и вы заполняете шаблон, используя вторые данные, и сохраняете во втором файле и т.д.
Комментарии:
1. Хорошо… Этот код выводится немного иначе, чем у меня, но не совсем правильно. Это создает правильный вывод в первом файле, но оставляет второй и третий выходные файлы пустыми…
2. Теперь я вижу, что вы читаете шаблон непосредственно из файла, поэтому после первого использования он считывается с конца файла, и это ничего не дает — вы можете повторно открыть шаблон или прочитать его в список при запуске.