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

#python

Вопрос:

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

имя 1 возраст
1
Крикет и шахматы

имя 2 возраст
2
Крикет, Теннис и хоккей

и т. д. и т. д. это продолжается до тех пор, пока не назовут имя 1000

Я пытаюсь написать программу на python, которая может преобразовать этот файл в этот файл и сохранить выходные данные в новый файл как
Hi name1. Вам исполнился 1 год. Тебе нравятся крикет и шахматы
, Привет, имя 2. Вам исполнилось 2 года. Вы любите крикет, Теннис, Хоккей
и так далее

Поскольку я не смог этого сделать,я попытался сделать это для небольшой выборки из 2,где я добавил эти(Имя:, Возраст:, Хобби:) перед ними

Имя : имя1
Возраст : возраст1
Увлечения : Крикет,Шахматы

Имя : имя2
Возраст : 2
года Увлечения : Крикет, Теннис и хоккей

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

 import re
number = 1
doc = open('profiles.txt', 'r')

def combine(line):
  x = ''
  if re.search("^Name :", line): x = str((line.partition(':'))[2])
  elif re.search("^Age :", line): x = str((line.partition(':'))[2])
  elif re.search("^Hobbies :", line): x = str((line.partition(':'))[2])
  else : pass
  return x
 
for n in doc: 
    # with open('Result.txt', 'a') as file: file.write(str("{0}) Hi {1}. You are aged{1}. You like{1}".format(number,str(combine(n)))))
    print(str("{0}) Hi {1}. You are aged{1}. You like{1}".format(number,str(combine(n)))))
    number  = 1
 

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

Комментарии:

1. Похоже, вам разрешено изменять формат файла. Почему бы тебе тогда не превратить его в json? Массив объектов. Было бы действительно легко манипулировать

2. Согласен! Но у меня все еще мало опыта работы в JSON. Но спасибо за ваш вклад! Я научусь этому в будущем!

3. Формат JSON совсем не сложный. Вам следует потратить около часа на то, чтобы ознакомиться с ним, и быть счастливым до конца своей жизни. Не рекомендуется использовать самостоятельные форматы, если это действительно не необходимо

Ответ №1:

В первом случае, когда у вас есть детали, разделенные разрывом строки, вы можете сделать:

 file_name = "./details.txt"

def print_details(name, age, hobbies):
    """Helper function to print the details in a nice format"""
    print(f"Hi {name}. You are aged {age}. You like {hobbies}")
    
# add details to a list until a newline is reached, print then reset
with open(file_name, 'r') as fin:
    details = []
    for line in fin:
        if line == 'n':
            print_details(*details)
            details = []
        else:
            details.append(line.strip())
    print_details(*details)
 

Комментарии:

1. Это именно то, что я искал! Огромное спасибо. Я изучу метод, который вы описали!

2. Отлично, рад, что это помогло.

Ответ №2:

Я думаю, что это более простой подход (основанный на втором формате файла, который вы предлагаете):-

 DEFAULT = {'Name': '', 'Age': '', 'Hobbies': ''}
with open('/Users/andy/profiles.txt') as p:
    d = dict(DEFAULT)
    for line in p:
        line = line.rstrip('n').strip()
        if len(line) == 0:
            print(
                f'Hi {d["Name"]}. Your age is {d["Age"]}. You like {d["Hobbies"]}')
            d = dict(DEFAULT)
        else:
            t = line.split(':')
            if len(t) == 2:
                d[t[0].strip()] = t[1].strip()
 

Комментарии:

1. Спасибо за вашу точку зрения, но переименовывать все имеющиеся у меня файлы-громоздкий процесс! Тем не менее я благодарен за то, что поделился своими знаниями!

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

Ответ №3:

Другая версия, педантичная с указанным вами форматом файла, использует .readlines()

Функция readlines() считывает все строки за один раз, а затем возвращает их в виде строковых элементов в списке, который вы можете очень легко повторить и очистить.

 with open('text_file.txt', 'r') as file1:
lines = file1.readlines()
 
i = 0
if i <= (len(lines)-3):
    while i in range(len(lines)):
        print (f"Hello, your name is {lines[i][:-1]}, you are {lines[i 1][:-1]} years old and you likes: {lines[i 2][:-1]}")
        i  =4
 

Мой текстовый файл-это:

 Mario
45
Cricket and Chess

Tobia
15
Cricket, Tennis and Hockey

Steve Tyler
70
Sex, Drugs, RocknRoll
 

Он распечатывает:

 Hello, your name is Mario, you are 45 years old and you likes: Cricket and Chess
Hello, your name is Tobia, you are 15 years old and you likes: Cricket, Tennis and Hockey
Hello, your name is Steve Tyler, you are 70 years old and you likes: Sex, Drugs, RocknRoll