#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