Python: как разделить функцию чтения файла и отображения пользовательского ввода - PullRequest
0 голосов
/ 06 марта 2019

Мне трудно разделить функции. Я пытаюсь иметь функцию чтения, где он читает текстовый файл, который у меня есть (который отделен символом ',' в текстовом файле). Тем не менее, в настоящее время у меня это под display_university. Функция отображения должна отображать формат, подобный категории «если», условно для моего кода ниже. ["UniversityName"] и ["ContactName"] - это заголовки из текстового файла (это похоже на чтение из базы данных с отображением содержимого под этим заголовком).

Текстовый файл в настоящее время выглядит так:

"UniversityName","ContactName"
"UCLA","John Kelly"
"UofFlorida","Mary Elizabeth"
"U of Memphis","Taylor Johnson"
"Harvard","Robert Fax"

Таким образом, в зависимости от того, что пользователь вводит, он будет отображать содержимое под этим заголовком. Прямо сейчас у меня есть это как Университет и Контакт. На основной файл, у меня есть пользователь, чтобы выбрать, что они хотят отобразить.

Моя программа сейчас должна сортироваться по университету или контакту. Так что, если бы я выбрал 1. (университет), выходные данные должны перечислить все названия университетов в следующем порядке:

University: Harvard
Name: Robert Fax

University: UCLA
Name: John Kelly

Name: UofFlorida
Name: Mary Elizabeth
....

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

Код:

import csv

def display_university(filename, category):
    with open(filename, mode='r') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        line_count = 0
        for row in csv_reader:
           if line_count == 0:
                print(f'{", ".join(row)}')
                line_count += 1
        if category == "University":
            print(f'University: {row["UniversityName"]}'
                  f'\nName: {row["ContactName"]}')
        if category == "Contact":
            print(f'Contact: {row["ContactName"]}'
                  f'\nUniversity: {row["UniversityName"]}')
        line_count += 1
    print(f'\nProcessed {line_count} lines.')


def main():
    filename = "List.txt"

    # list_files = read_file(filename)
    try:
        print("1. University")
        print("2. Contact Name")
        choice = input()
        choice = int(choice)

        if choice == '1':
            # display_university(list_files, "University")
        elif choice == '2':
            # display_university(list_files, "Contact")

        else:
            raise ValueError("Invalid option selected")

    except ValueError:
        print("Unexpected error.")

if __name__ == "__main__":
    main()

1 Ответ

2 голосов
/ 06 марта 2019

Я догадываюсь вы ищете что-то вроде этого. Прочитайте CSV в dict, где каждый ключ - это название университета, а значение - список контактов в виде строк. Затем с помощью отдельной функции выберите, что печатать из этого диктата.

import csv
import logging

def read_university_contacts(filename):
    """
    Read CSV file into a dict and return it.
    """
    with open(filename, mode='r') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        university_contacts = dict()
        for line_count, row in enumerate(csv_reader, 1):
           if line_count == 1:
                # Not sure why you have this, skip header?
                #continue
                pass
           university = row["UniversityName"]
           contact = row["ContactName"]
           if university not in university_contacts:
               university_contacts[university] = [contact]
           else:
               university_contacts[university].append(contact)
    # Use logging for diagnostics
    logging.info(f'Processed {line_count} lines')
    # Return the structure we read
    return university_contacts    

def main():
    logging.basicConfig(level=logging.INFO, format='%(module)s:%(asctime)s:%(message)s')
    contacts = read_university_contacts("List.txt")

    while True:
        try:
            print("1. University")
            print("2. Contact Name")
            choice = input()
            choice = int(choice)
            break
        except ValueError:
            logging.warning("Unexpected error.")

    # Don't compare to string; you converted to int() above
    if choice == 1:
        print(list(contacts.keys()))
    elif choice == 2:
        print(list(contacts.values()))
    else:
        raise ValueError("Invalid option selected")


if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...