Фильтрация Python и извлечение текста

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

Исходный TXT-файл:


Расположение класса: 1А-1.
(Имя ученицы: Джесс, Тема: EC001, Время: 9:00–10:00)
(Имя учащегося: Уит, Тема: EC001, Время: 9:00–10:00)
(Имя ученика: Джон, Тема: EC0011, Время: 11:00–12:00)
(Имя ученика: Кевин, Тема: EC011, Время: 11:00–12:00)
(Имя ученицы: Джесс, Тема: EC011, Время: 11:00–12:00)


Расположение класса: 1А-2.
(Имя ученицы: Джесс, Тема: EC002, Время: 11:00–12:00)
(Имя учащегося: Уит, Тема: EC002, Время: 11:00–12:00)
(Имя ученика: Джон, Тема: EC002, Время: 11:00–12:00)
(Имя ученика: Кевин, Тема: EC002, Время: 11:00–12:00)
(Имя ученицы: Клэр, Тема: EC011, Время: 14:00–15:00)
(Имя ученика: Джошуа, Тема: EC0011, Время: 14:00–15:00)
(Имя студента: Флоренция, Тема: EC011, Время: 14:00–15:00)
(Имя ученика: Нил, Тема: EC011, Время: 2:00–15:00)

Предполагаемый результат:


Класс: 1A-1, Джесс, Тема: EC001 Время: 9:00–10:00, Тема: EC011, Время: 11:00–12:00.
Класс: 1А-1, Уит, Тема: EC001 Время: 9:00 – 10:00.
Класс: 1A-1, Джон, Тема: EC0011 Время: 11:00–12:00.
Класс: 1А-1, Кевин, Тема: EC011 Время: 11:00–12:00.
Класс: 1А-2, Джесс, Тема: EC002 Время: с 11:00 до 12:00.
Класс: 1А-2, Джон, Тема: EC002, Время: 11:00–12:00.
Класс: 1А-2, Уит, Тема: EC002 Время: с 11:00 до 12:00.
Класс: 1А-2, Кевин, Тема: EC002, Время: 11:00–12:00.
Класс: 1А-2, Клэр, Тема: EC011, Время: 14:00–15:00.
Класс: 1А-2, Джошуа, Тема: EC0011, Время: 14:00–15:00.
Класс: 1A-2, Флоренция, Тема: EC011, Время: 14:00–15:00.
Класс: 1A-2, Нил, Тема: EC011, Время: 2:00–15:00.

Я пробовал передавать строки чтения в модули перед выполнением вывода в консоль, но это кажется совершенно неправильным, потому что мне нужен класс 1A-1, предшествующий каждой строке.

Текущий выход:


Класс 1А-1
Джесс, Тема: EC001 Время: 9–10 утра.
Джесс, Тема: EC011, Время: 11:00–12:00.
Whit, Тема: EC001 Время: 9–10 утра.
Джон, Тема: EC0011 Время: 11:00–12:00.
Кевин, Тема: EC011 Время: 11:00–12:00.

Вам действительно нужно использовать панд?

mozway 30.04.2024 16:03

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

John Teo 30.04.2024 16:06

Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Поскольку сейчас написано, трудно точно сказать, о чем вы спрашиваете.

Community 30.04.2024 16:11

Добавьте код Python, чтобы получить помощь.

Dan Nagle 30.04.2024 16:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот ваше решение. Вам нужно будет настроить значения путей к входным/выходным файлам:

класс.py

import collections


def ingest(infilepath):
    """
    Read all the input from the input file.
    Store it in a dictionary so that we can parse it out later.
    We'll use a collections.defaultdict to make life easier
        {classroom name: {student name: [classes...]} }
            key'd by student name since a student can have multiple courses in a classroom
    """
    answer = collections.defaultdict(lambda: collections.defaultdict(list))
    with open(infilepath) as infile:
        classes = infile.read().split('\n\n')  # divide the input into blocks of classrooms
        classes = [c.strip() for c in classes]  # strip out any extra whitespace

    for classblock in classes:
        name, *records = classblock.splitlines()  # student records per classroom
        name = name.split(':',1)[-1].strip()
        for record in records:
            record = record.replace("(", "").replace(")", '')  # strip out the "()". We don't need that
            kvs = record.split(',')

            d = dict(kv.split(":") for kv in kvs)
            d = {k.strip():v.strip() for k,v in d.items()}

            answer[name][d['Student Name']].append(d)

    return answer


def output(outfilepath, data):
    order = ("Subject", "Time")  # the order in which we want to write the output
    with open(outfilepath, 'w') as outfile:
        for classname, d in data.items():
            for studentname, L in d.items():
                outfile.write(f"Classroom: {classname}, {studentname}, ")
                out = []  # maintain the line output in a list. We'll join everything up later
                for d in L:
                    for k in order:
                        out.append(f"{k}: {d[k]}, ")

                out = ''.join(out)  # this is the file output
                out = out.strip().rstrip(',')  # strip out the trailing ','
                outfile.write(f'{out}\n')


if __name__ == "__main__":
    print('starting')

    data = ingest('path/to/input/file')
    output('path/to/output/file', data)

    print('done')

Я использовал этот ввод (обратите внимание на пустые строки в начале файла):



Classroom arrangement : 2A-1
(Student Name: Jess, Subject: EC001, Time: 9am - 10am)
(Student Name: Whit, Subject: EC001, Time: 9am - 10am)
(Student Name: Jon, Subject: EC0011, Time: 11am - 12pm)
(Student Name: Kevin, Subject: EC011, Time: 11am - 12pm)
(Student Name: Jess, Subject: EC011, Time: 11am - 12pm)


Classroom arrangement : 1A-2
(Student Name: Jess, Subject: EC002, Time: 11am - 12pm)
(Student Name: Whit, Subject: EC002, Time: 11am - 12pm)
(Student Name: Jon, Subject: EC002, Time: 11am - 12pm)
(Student Name: Kevin, Subject: EC002, Time: 11am - 12pm)
(Student Name: Claire, Subject: EC011, Time: 2pm - 3pm)
(Student Name: Joshua, Subject: EC0011, Time: 2pm - 3pm)
(Student Name: Florence, Subject: EC011, Time: 2pm - 3pm)
(Student Name: Neil, Subject: EC011, Time: 2am - 3pm)

Я получил этот вывод:

Classroom: 1A-1, Jess, Subject: EC001, Time: 9am - 10am, Subject: EC011, Time: 11am - 12pm
Classroom: 1A-1, Whit, Subject: EC001, Time: 9am - 10am
Classroom: 1A-1, Jon, Subject: EC0011, Time: 11am - 12pm
Classroom: 1A-1, Kevin, Subject: EC011, Time: 11am - 12pm
Classroom: 1A-2, Jess, Subject: EC002, Time: 11am - 12pm
Classroom: 1A-2, Whit, Subject: EC002, Time: 11am - 12pm
Classroom: 1A-2, Jon, Subject: EC002, Time: 11am - 12pm
Classroom: 1A-2, Kevin, Subject: EC002, Time: 11am - 12pm
Classroom: 1A-2, Claire, Subject: EC011, Time: 2pm - 3pm
Classroom: 1A-2, Joshua, Subject: EC0011, Time: 2pm - 3pm
Classroom: 1A-2, Florence, Subject: EC011, Time: 2pm - 3pm
Classroom: 1A-2, Neil, Subject: EC011, Time: 2am - 3pm

Надеюсь это поможет

Спасибо за ваше руководство!! Ценить это :)

John Teo 30.04.2024 16:51

Другие вопросы по теме