Обзор базовых операций ввода-вывода файлов

Beginner

This tutorial is from open-source community. Access the source code

Введение

В этом практическом занятии (лабораторной работе) вы научитесь рассматривать основные операции ввода и вывода файлов в Python. Вы создадите программу на Python для чтения данных из файла с информацией о портфеле акций и расчета общей стоимости портфеля.

Цели этого практического занятия включают изучение способов открытия и чтения файлов в Python, обработки данных из файлов построчно, выполнения расчетов на основе этих данных и вывода результатов. Файл, который вы создадите, будет называться pcost.py.

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня начальный с процентом завершения 89%. Он получил 98% положительных отзывов от учащихся.

Понимание проблемы

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

В вашем проекте есть файл с именем portfolio.dat. Этот файл хранит информацию о портфеле акций. Портфель акций - это своего рода коллекция различных акций, которые принадлежат инвестору. Каждая строка в этом файле представляет собой одну покупку акций. Формат каждой строки следующий:

[Тикер акции] [Количество акций] [Цена за одну акцию]

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

Давайте рассмотрим пример. Возьмем первую строку файла:

AA 100 32.20

Эта строка показывает, что было куплено 100 акций с тикером "AA". Каждая акция стоила $32.20.

Если вы хотите посмотреть, что находится внутри файла portfolio.dat, вы можете выполнить следующую команду в терминале. Команда cat - это полезный инструмент в терминале, который позволяет просматривать содержимое файла.

cat ~/project/portfolio.dat

Теперь ваша задача - создать программу на Python с именем pcost.py. Эта программа будет выполнять три основные задачи:

  1. Во - первых, ей нужно открыть и прочитать файл portfolio.dat. Открытие файла в Python позволяет нашей программе получить доступ к данным, хранящимся в нем.
  2. Затем нужно рассчитать общую стоимость всех покупок акций в портфеле. Для этого для каждой строки в файле нужно умножить количество акций на цену за одну акцию. После получения этих значений для каждой строки мы суммируем их все. Это дает нам общую сумму денег, потраченную на все акции в портфеле.
  3. Наконец, программа должна вывести общую стоимость. Таким образом, мы можем увидеть результат наших расчетов.

Давайте начнем с создания файла pcost.py. Вы можете использовать редактор для открытия и редактирования этого файла. Он был уже создан для вас на этапе настройки. В этом файле вы напишете код на Python для решения проблемы, которую мы только что обсудили.

Открытие и чтение файла

На этом этапе мы научимся открывать и читать файлы в Python. Ввод/вывод файлов (I/O) - это фундаментальное понятие в программировании. Он позволяет вашей программе взаимодействовать с внешними файлами, такими как текстовые файлы, CSV-файлы и другие. В Python одним из наиболее распространенных способов работы с файлами является использование функции open().

Функция open() используется для открытия файла в Python. Она принимает два важных аргумента. Первый аргумент - это имя файла, который вы хотите открыть. Второй аргумент - это режим, в котором вы хотите открыть файл. Когда вы хотите прочитать файл, вы используете режим 'r'. Это сообщает Python, что вы хотите только прочитать содержимое файла и не вносить в него никаких изменений.

Теперь давайте добавим некоторый код в файл pcost.py для открытия и чтения файла portfolio.dat. Откройте файл pcost.py в своем редакторе кода и добавьте следующий код:

## pcost.py
## Calculate the total cost of a portfolio of stocks

def portfolio_cost(filename):
    """
    Computes the total cost (shares*price) of a portfolio file
    """
    total_cost = 0.0

    ## Open the file
    with open(filename, 'r') as file:
        ## Read all lines in the file
        for line in file:
            print(line)  ## Just for debugging, to see what we're reading

    ## Return the total cost
    return total_cost

## Call the function with the portfolio file
total_cost = portfolio_cost('portfolio.dat')
print(f'Total cost: ${total_cost}')

Разберем, что делает этот код:

  1. Сначала мы определяем функцию с именем portfolio_cost(). Эта функция принимает имя файла в качестве входного параметра. Цель этой функции - рассчитать общую стоимость портфеля акций на основе данных в файле.
  2. Внутри функции мы используем функцию open() для открытия указанного файла в режиме чтения. Здесь используется оператор with, чтобы убедиться, что файл будет правильно закрыт после того, как мы закончим его чтение. Это хорошая практика, чтобы избежать утечки ресурсов.
  3. Затем мы используем цикл for для чтения файла построчно. Для каждой строки в файле мы выводим ее на экран. Это только для целей отладки, чтобы мы могли видеть, какие данные мы читаем из файла.
  4. После чтения файла функция возвращает общую стоимость. В настоящее время общая стоимость установлена равной 0.0, потому что мы еще не реализовали фактический расчет.
  5. Вне функции мы вызываем функцию portfolio_cost() с именем файла 'portfolio.dat'. Это означает, что мы просим функцию рассчитать общую стоимость на основе данных в файле portfolio.dat.
  6. Наконец, мы выводим общую стоимость с использованием f-строки.

Теперь давайте запустим этот код, чтобы увидеть, что он делает. Вы можете запустить файл Python из терминала, используя следующую команду:

python3 ~/project/pcost.py

Когда вы запустите эту команду, вы должны увидеть каждую строку файла portfolio.dat, выведенную в терминале, за которой следует общая стоимость, которая в настоящее время установлена равной 0.0. Этот вывод помогает вам убедиться, что файл читается правильно.

Обработка данных

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

Каждая строка в файле имеет определенный формат: [Тикер акции] [Количество акций] [Цена за одну акцию]. Чтобы рассчитать стоимость каждой покупки акций, нам нужно извлечь количество акций и цену за одну акцию из каждой строки. Затем мы умножаем эти два значения друг на друга, чтобы получить стоимость данной покупки акций. Наконец, мы добавляем эту стоимость к накопленной общей сумме, чтобы найти общую стоимость портфеля.

Давайте модифицируем функцию portfolio_cost() в файле pcost.py, чтобы достичь этого. Вот модифицированный код:

def portfolio_cost(filename):
    """
    Computes the total cost (shares*price) of a portfolio file
    """
    total_cost = 0.0

    ## Open the file
    with open(filename, 'r') as file:
        ## Read all lines in the file
        for line in file:
            ## Strip any leading/trailing whitespace
            line = line.strip()

            ## Skip empty lines
            if not line:
                continue

            ## Split the line into fields
            fields = line.split()

            ## Extract the relevant data
            ## fields[0] is the stock symbol (which we don't need for the calculation)
            shares = int(fields[1])  ## Number of shares (second field)
            price = float(fields[2])  ## Price per share (third field)

            ## Calculate the cost of this stock purchase
            cost = shares * price

            ## Add to the total cost
            total_cost += cost

            ## Print some debug information
            print(f'{fields[0]}: {shares} shares at ${price:.2f} = ${cost:.2f}')

    ## Return the total cost
    return total_cost

Разберем, что делает эта модифицированная функция шаг за шагом:

  1. Удаление пробелов: Мы используем метод strip(), чтобы удалить все ведущие и завершающие пробелы из каждой строки. Это гарантирует, что при разделении строки на поля мы не случайно включим лишние пробелы.
  2. Пропуск пустых строк: Если строка пуста (то есть содержит только пробелы), мы используем оператор continue, чтобы пропустить ее. Это помогает избежать ошибок при попытке разделить пустую строку.
  3. Разделение строки на поля: Мы используем метод split(), чтобы разделить каждую строку на список полей на основе пробелов. Это позволяет нам отдельно обращаться к каждой части строки.
  4. Извлечение нужных данных: Мы извлекаем количество акций и цену за одну акцию из списка полей. Количество акций - это второе поле, а цена за одну акцию - третье поле. Мы преобразуем эти значения в соответствующие типы данных (int для количества акций и float для цены), чтобы можно было выполнять арифметические операции с ними.
  5. Расчет стоимости: Мы умножаем количество акций на цену за одну акцию, чтобы рассчитать стоимость данной покупки акций.
  6. Добавление к общей сумме: Мы добавляем стоимость данной покупки акций к накопленной общей стоимости.
  7. Вывод отладочной информации: Мы выводим некоторую информацию о каждой покупке акций, чтобы видеть, что происходит. Это включает в себя тикер акции, количество акций, цену за одну акцию и общую стоимость покупки.

Теперь давайте запустим код, чтобы проверить, работает ли он. Откройте терминал и выполните следующую команду:

python3 ~/project/pcost.py

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

Финализация программы

Теперь мы собираемся очистить наш код и создать окончательную версию программы pcost.py. Очистка кода означает удаление всех ненужных частей и обеспечение хорошего вида вывода. Это важный шаг в программировании, так как делает наш код более профессиональным и легким для понимания.

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

Вот окончательная версия кода pcost.py:

## pcost.py
## Calculate the total cost of a portfolio of stocks

def portfolio_cost(filename):
    """
    Computes the total cost (shares*price) of a portfolio file
    """
    total_cost = 0.0

    try:
        ## Open the file
        with open(filename, 'r') as file:
            ## Read all lines in the file
            for line in file:
                ## Strip any leading/trailing whitespace
                line = line.strip()

                ## Skip empty lines
                if not line:
                    continue

                ## Split the line into fields
                fields = line.split()

                ## Extract the relevant data
                ## fields[0] is the stock symbol (which we don't need for the calculation)
                shares = int(fields[1])  ## Number of shares (second field)
                price = float(fields[2])  ## Price per share (third field)

                ## Calculate the cost of this stock purchase and add to the total
                total_cost += shares * price

    except FileNotFoundError:
        print(f"Error: Could not find file '{filename}'")
        return 0.0
    except Exception as e:
        print(f"Error processing file: {e}")
        return 0.0

    ## Return the total cost
    return total_cost

## Main block to run when the script is executed directly
if __name__ == '__main__':
    ## Call the function with the portfolio file
    total_cost = portfolio_cost('portfolio.dat')
    print(f'Total cost: ${total_cost:.2f}')

В этой окончательной версии кода есть несколько улучшений:

  1. Обработка ошибок: Мы добавили код для перехвата двух типов ошибок. FileNotFoundError возникает, когда указанный файл не существует. В этом случае программа выведет сообщение об ошибке и вернет 0.0. Блок Exception перехватывает любые другие ошибки, которые могут возникнуть при обработке файла. Это делает нашу программу более надежной и менее склонной к неожиданным сбоям.
  2. Корректный формат: Общая стоимость форматируется с двумя знаками после запятой с использованием спецификатора формата :.2f в f-строке. Это делает вывод более профессиональным и легким для чтения.
  3. Проверка __name__ == '__main__': Это распространенная идиома в Python. Она гарантирует, что код внутри блока if выполняется только при прямом запуске скрипта. Если скрипт импортируется как модуль в другой скрипт, этот код не будет выполняться. Это дает нам больше контроля над поведением нашего скрипта.

Теперь давайте запустим окончательный код. Откройте терминал и введите следующую команду:

python3 ~/project/pcost.py

При выполнении этой команды программа прочитает файл portfolio.dat, рассчитает общую стоимость портфеля и выведет результат. Вы должны увидеть общую стоимость портфеля, которая должна быть равна $44671.15.

Поздравляем! Вы успешно создали программу на Python, которая читает данные из файла, обрабатывает их и вычисляет результат. Это большой успех, и это показывает, что вы идете по пути к становлению опытным программистом на Python.

Резюме

В этом практическом занятии вы научились выполнять основные операции ввода-вывода файлов в Python. Вы можете открывать и читать файлы с использованием функции open() и менеджера контекста, обрабатывать данные построчно, разбирать текстовые данные, выполнять вычисления, обрабатывать ошибки и структурировать полноценную программу на Python с использованием функций и основного блока.

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