Почему для l oop повторяется только один раз? - PullRequest
0 голосов
/ 03 марта 2020

Я довольно новичок в кодировании, но поскольку мне нужно написать несколько букв, я хотел написать скрипт для автоматического изменения имени в этом письме.

У меня есть текстовый файл с заполнителями для имя и csv-файл, в котором имена хранятся в следующем формате:

Surname;Firstname
Doe;John
Norris;Chuck
...

Теперь я создал этот скрипт:

import csv
import re

letterPATH = "Brief.txt"
tablePATH = "Liste.csv"


with open(letterPATH, "r") as letter, open(tablePATH, "r") as table:
    table = csv.reader(table, delimiter=";")
    rows = list(table)
    rows = rows[1::]
    print(rows)
    for (surname, firstname) in rows:
        #Check if first- and surname have correct output
        #print(firstname)
        #print(surname)

        for lines in letter:
            new_content = ""
            print(lines)
            lines = re.sub(r"\<Nachname\>", surname, lines)
            print(lines)
            lines = re.sub(r"\<Vorname\>", firstname, lines)
            print(lines)
            new_content += lines
        with open(surname + firstname +".txt", "w") as new_letter:
            new_letter.writelines(new_content)

У меня есть следующее Теперь проблема: существует файл, созданный текстовый файл для каждой записи, как и должно (JohnDoe.txt, ChuckNorris.txt и т. д.), однако только первый файл имеет правильное содержимое, а остальные пустые.

Пока отладка Я видел, что for-l oop в строке 18 повторяется только один раз, а оператор with повторяется несколько раз, как и должно. Я просто не понимаю, почему for-l oop не повторяется.

Приветствия и спасибо за вашу помощь! :)

1 Ответ

1 голос
/ 03 марта 2020

letter - это файл. Файл отслеживает, сколько вы прочитали и где должно быть следующее чтение. Поэтому, если вы прочитали две строки, следующее чтение будет на третьей строке и т. Д.

Поскольку вы читаете весь файл в первый раз, на следующих итерациях он не будет читать больше строк из файла, так как вы уже прочитали их.

Решение может состоять в том, чтобы сбросить указатель файла (вещь, указывающая, где в файле, который вы сейчас читаете), в начало с letter.seek(0) метод. Или вы можете просто сохранить содержимое файла в списке напрямую и выполнить итерацию по списку.

import csv
import re

letterPATH = "Brief.txt"
tablePATH = "Liste.csv"


with open(letterPATH, "r") as letter_file, open(tablePATH, "r") as table:
    table = csv.reader(table, delimiter=";")
    letter = list(letter_file)  # Add all content to a list instead.
    rows = list(table)
    rows = rows[1::]
    print(rows)
    for (surname, firstname) in rows:
        #Check if first- and surname have correct output
        #print(firstname)
        #print(surname)

        for lines in letter:
            new_content = ""
            print(lines)
            lines = re.sub(r"\<Nachname\>", surname, lines)
            print(lines)
            lines = re.sub(r"\<Vorname\>", firstname, lines)
            print(lines)
            new_content += lines
        with open(surname + firstname +".txt", "w") as new_letter:
            new_letter.writelines(new_content)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...