Есть ли способ записать биты текста в разные файлы, если выполняются разные условия? - PullRequest
1 голос
/ 20 января 2020

У меня есть этот текст, часть которого я поделюсь,

ROMEO

Но, софт! какой свет через те окна разбивается? Это восток, а Джульетта - это солнце.

Джульетта

Да, я!

ROMEO

Она говорит: О, говори снова, светлый ангел! для тебя.

Джульетта

О Ромео, Ромео! Посему ты Ромео? Отрицай отца твоего и отвергай имя твое;

ROMEO

Должен ли я услышать больше или я скажу об этом?.

Я хочу написать al oop, который ищет имя в строке и сохраняет содержимое после него в указанном c файле, в этом случае, если «ROMEO» - это слово, которое встречается в каждой строке после его сохранения в "Romeo.txt" до тех пор, пока не будет найдено слово "JULIET", тогда весь контент будет сохранен в "Juliet.txt". Я пытался кодировать его сам с объединением циклов и операторов if, но это ни к чему не привело. handle = open ("romeo-full.txt") skipper = "ROMEO"

handle = open("romeo-full.txt")
skipper = "ROMEO"

for line in handle:
    line = line.strip()     
    while skipper == "ROMEO":
        print(line) #This would be the write to file code
        if line.startswith("ROMEO"):
            skipper = "JULIET"
            break
        else:
            continue

    while skipper == "JULIET":
        print(line) #This would be the write to file code
        if line.startswith("ROMEO"):
            skipper = "ROMEO"
            break
        else:
            continue

Вывод в основном представляет собой циклы строк "ROMEO", которые, как я понял, происходят из-за того, что l oop проходит через первая строка навсегда, но я не мог найти выход ближе к тому, чего я хочу.

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Одним из способов избежать дублирования кода будет использование заголовков в главном файле в качестве «селекторов» для какого файла записывать. Что-то вроде:

with open("romeo-full.txt") as handle, \
     open("romeo.txt", 'w') as r_f, \
     open("juliet.txt", 'w') as j_f:

    file_chooser = {"ROMEO": r_f,
                    "JULIET": j_f}

    for line in handle:
        try:
            cur_file = file_chooser[line.strip()]
        except KeyError:     
            cur_file.write(line)

Цель блока try/except состоит в том, чтобы изменять cur_file только тогда, когда мы сталкиваемся с одним из заголовков (а затем пропускаем его).


Один из способов избежать этого - использовать метод dict get с cur_file по умолчанию (поэтому он изменяется только в заголовках):

with open("romeo-full.txt") as handle, \
     open("romeo.txt", 'w') as r_f, \
     open("juliet.txt", 'w') as j_f:

    file_chooser = {"ROMEO": r_f,
                    "JULIET": j_f}
    cur_file = r_f
    for line in handle:
        cur_file = file_chooser.get(line.strip(), cur_file)

        cur_file.write(line)

Недостатком здесь является то, что заголовки также будут записываться каждый раз в файлы.

0 голосов
/ 20 января 2020

Вы можете записать в несколько файлов, например, так:

with open('example1.txt', 'w') as file_1 \
        , open('example2.txt', 'w') as file_2 \
        , open('example3.txt', 'w') as file_3 \
        , open("romeo-full.txt", 'r') as handle:
    for line in handle:
        if condition_1:
            file_1.write(line)
        elif condition_2:
            file_2.write(line)
        elif condition_3:
            file_3.write(line)

Причина, по которой вы всегда должны использовать with вместо open и close, заключается в том, что если по какой-то причине вы не закрываете (например, сбой программы или вы забыли добавить ее), файл не будет закрыт, занимая место. Я видел, как случается, что файлы, которые часто открываются и не закрываются, заставляют серверы взламывать sh!

...