Как запустить текстовый файл из второй строки цикла for в Python? - PullRequest
0 голосов
/ 03 ноября 2018
def main():

    text = open("unformated.txt", "r").readlines()
    infile = open("formated", "w")   

    title = ""


    for k, line in enumerate(text):     


        if (k == 0):                        
            for i in text[0].split():       
                i = i.lower()               
                title += i.capitalize() + " "   
            title = title + text[1][find("Prudence") : find("Prudence") + len("Prudence")] 
            infile.write(title.center(100, " ")

        if (k == 1)                         
            text[1].replace("Prudence ", "")
            infile.write(text[1])                
            infile.write("\n")              


        if (k > 1)                          
            words_in_list = ""                              
            for j in line.split():          
                words_in_list += j + " "    
            infile.write(words_in_list)                     
            infile.write("\n")              

    infile.close()
main()

enter image description here Неформатированная версия

enter image description here Отформатированная версия

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

  1. Я не знаю, как использовать цикл for k, enumerated(text: для перехода со второй строки (строки)

  2. Я думаю, что title можно как-то обработать вне цикла for. Проблема с заголовком состоит в том, как взять строку "Prudence" из второй строки и добавить ее к заголовку в первой строке. И затем сделать строку "by" (вторая строка) с заглавной буквы "B", которая будет началом строки во второй строке, пока мы находимся в цикле.

  3. Я не знаю, как сделать отступ в абзацах, я знаю только для rjust(), но как узнать, какая строка будет абзацем, то есть, после какой строки сделать (и как) новую линия. Почему-то infile.write("\n") не работает?

  4. Учитывая тот факт, что я нахожусь в начале курса, мы не должны использовать операторы if / else (хотя я использовал их здесь, у меня нет других идей для других решений) и другие управляющие структуры .

Когда эта строка кода выполняется:

text = open("unformated.txt","r").readlines()

что именно у меня в переменной text?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

text = open ("unformated.txt", "r"). Readlines () хранит содержимое файла в списке.

в строке для k, строка в перечислении (текст): она перебирает текст за строкой. Теперь, если вам нужно, чтобы ваш цикл начинался со второй строки, вы можете попробовать так:

для k, строка в перечислении (текст [2:]):

также, если вы хотите получить больше readbale, вы можете написать так:

для k, строка в перечислении (текст [2:], 2):
таким образом, значение k будет начинаться с 2, а цикл также начинается со второй строки.

Надеюсь, я правильно понял вопрос.

0 голосов
/ 03 ноября 2018

В документации .readlines () , по сути, читает все строки в файле и возвращает список всех строк.

Также обратите внимание, что вы можете просто for line in text перебирать строки, и, поскольку text является итерацией, вы также можете перечислять его. Чтобы пропустить первую строку, просто используйте .next(), которая также возвращает строку, таким образом, вы можете сохранить ее и / или записать, используя .next, а затем просто перебрать их.

Принимая во внимание пример, который вы даете, и результат, который вы хотите, я говорю, что вам не нужен весь этот код (и при этом вам не нужен readlines() или enumerate() на самом деле), чтобы получить результат, который вы находясь в поиске. Я говорю, что вы можете использовать что-то, что просто определяет конец абзаца как строку, которая заканчивается точкой и возвратом каретки. (т. Е. '.\n)

unformatted = open("unformated.txt", "r")
formatted = open("formated", "w")

    #use .next() to get the next line. .next for the first time returns the first line
formatted.write(unformatted.next().title().center(100)

    #then the rest just split paragraphs as I described above
for line in unformatted:
    if line.endswith('.\n')
        formatted.write('{}\n}'.format(line))
    elif line.startswith('Prudence'):
        formatted.write('\t{}\n'.format(unformatted.next()))
    else:
        formatted.write(line.replace('\t', ''))

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

РЕДАКТИРОВАТЬ - , как указано выше, содержит операторы if

Технически вы могли бы просто предположить, что первые 2 строки являются строками заголовка. и использовать для них диктовщик. Это понадобится enumerate().

def make_title(t):
    return t.title().center(100)

def make_subtitle(t):
    return '\t' + t

def other_lines(t):
   return x.replace('.\n', ',\n\n')

special_lines = {
    0: make_title,
    1: make_subtitle
}

for n, line in enumerate(unformatted):
    formatted.write(special_lines.get(n, other_lines))(line)

Кто-нибудь, пожалуйста, проверьте мою работу. Я не за компьютером, чтобы проверить, но я думаю, что это правильно, учитывая его ограничения, я знаю, что мог бы использовать лямбду для функций, но я не хотел переусердствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...