@Elbro

Как из txt файла вытащить строки с одинаковым началом?

Задача достаточно простая, но что-то никак не могу в голове обрисовать ее решение на практику.

Задача такая, есть список:

family = ['mom', 'dad', 'brother']

Есть txt файл с диалогом, который начинается с человека
mom - Hello, do you need anything in the shop?
brother - Yes, bring some fruits
dad - And beer
mom - okey
dad - thx
brother - thx


Задача вытащить циклом(?) сообщения каждого.

Как я это вижу:
Считывать весь текст и искать абонента
Затем if state по абоненту, мол мама писала следующие сообщение, отец такие, а брат такие. Что-то никак не могу понять как это сделать в минимум кода.
f=open("test.rtf","r")
for line in f:
    words=line.split()
    if words:
        print(words[0])
        print(line)

f.close()

Пока только нашел как искать первое слово, но как сделать чтобы печатать только содержащее mom, затем dad и тд
  • Вопрос задан
  • 222 просмотра
Решения вопроса 3
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
f=open("test.rtf","r")
for line in f:
    words=line.split()
    if words:
        if words[0] == "mom":
           print(words[0])
           print(line)

f.close()
Ответ написан
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
data = '''mom a
dad b
dad c
mom d
dad e'''
start_text = 'mom'
[print(item) for item in data.splitlines() if item.startswith(start_text)]
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Очень просто.
dialogue = dict()  # обычный питоновский словарь

# datasource - коллекция строк. Но данные можно читать и построчно из файла 
# with open('text.txt', 'rt') as datasource:
datasource = """mom - Hello, do you need anything in the shop?
brother - Yes, bring some fruits
dad - And beer
mom - okey
dad - thx
brother - thx
""".split()  

for line in datasource:
    actor, _, text = line.split(' - ')  # разбиваем строку на две части
    if _ is not None:  # нашли разделитель, действуем
        # если нужного ключа не было, создать его с указанным значением,
        # (в нашем случае с новым пустым списком) и вернуть это значение
        # а если ключ был, то просто вернуть его значение
        actor_lines = dialogue.setdefault(actor.lower(), [])
        actor_lines.append(text)
print(dialogue)


Можно и с defaultdict, так несколько удобнее:

from collections import defaultdict 
# если у словаря спрашивают неизвестный ключ, он по-тихому 
# поместит по этому ключу пустой список, и отдаст этот список
# этот словарь будет хранить результат
dialogue = defaultdict(list)  # list - фабрика новых значений

# datasource - коллекция строк. Но данные можно читать и построчно из файла 
# with open('text.txt', 'rt') as datasource:
datasource = """mom - Hello, do you need anything in the shop?
brother - Yes, bring some fruits
dad - And beer
mom - okey
dad - thx
brother - thx
""".split()  

for line in datasource:
    actor, _, text = line.split(' - ')  # разбиваем строку на две части
    if _ is not None:  # нашли разделитель, действуем
        # если нужного значения ключа не было, defaultdict сам создаст запрошенный ключ
        # так что мы гарантированно получим список
        dialogue[actor.lower()].append(text)

print(dialogue)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Подсказка: отсортировать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы