Ремесла за десять минут

Это 5-я часть серии. Чтобы вернуться к части 1, нажмите здесь.

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

Весь код здесь доступен в этом репозитории Github. Работа с Github выходит за рамки этого руководства, но вы можете просто загрузить zip-файл с сайта. Часть кода здесь может сначала показаться сложным, но уверяю вас, бояться нечего. Все это строилось построчно, и вид сразу все заставляет выглядеть страшнее, чем есть на самом деле. Возьмите его по одной строке, прочтите пояснения после кода и вернитесь к предыдущим частям серии при необходимости .

Финансовый менеджер

Существует множество бюджетных приложений для Android и iOS, созданных с использованием Java и Swift. Мы собираемся создать простое бюджетное приложение, которое мы сможем адаптировать к нашим потребностям в будущем.

Попробуем найти решение. Помните, что во всех случаях действительно полезно сначала разобраться в проблеме. К счастью, я ваш клиент и могу сказать вам именно то, что хочу.

Я хочу, чтобы программа:

  • Позвольте мне ввести переменную зарплату и переменные расходы.
  • Вычтите расходы и добавьте зарплату в бюджет.
  • Позвольте мне просмотреть обновленный бюджет.
  • Сохраните бюджет для использования в будущем.

Попробуйте реализовать свое решение этой проблемы и покажите мне в комментариях!

Деньги под управлением

Прежде чем мы начнем, нам нужно установить Pandas (в комплекте с Miniconda), отличную библиотеку для анализа данных. Мы собираемся использовать его только для хранения файлов CSV, так что это похоже на использование игрового ПК для просмотра веб-страниц в Интернете. Откройте командную строку Anaconda или терминал, введите conda install pandas и нажмите клавишу ВВОД. Возможно, вам придется нажать Y на клавиатуре, чтобы продолжить установку.

После завершения установки запустите VS Code и создайте новый файл. Назовите его как хотите и последовательно введите следующие блоки кода в редакторе. Помните, что для вас терминал в основном будет использоваться для запуска вашего кода, а не для его редактирования.

# Some Helpful Libraries
import pandas as pd

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

# Try opening the csv file
try:
    # if file found open the file and set the budget column to the 
    # budget variable
    df = pd.read_csv("budget.csv", index_col=None)
    budget = df.loc[0, "Budget"]
except FileNotFoundError:
    # If file is not found, set budget to 0 and create a dataframe
    # with our budget and savings
    budget = 0
    df = pd.DataFrame({"Budget": [0]})

Блок попробовать и кроме - это способ узнать, есть ли ошибки в нашем коде, и предпринять какие-либо действия, если они есть. Первая (попытка) часть пытается что-то, и если она вызывает ошибку, она переходит во вторую (кроме) часть. Мы можем указать, какой тип ошибки мы хотим перехватить в блоке except, поместив рядом с ним название ошибки. Я знаю только название ошибки, потому что я пытался запустить код без средства обнаружения ошибок.

Внутри try block мы создаем переменную с именем df и сохраняем объект фрейма данных. Это специальный объект, который предоставляет нам Pandas, и он оптимизирован для электронных таблиц и таблиц. pd.read_csv() читает файл CSV и превращает его в фрейм данных. Он также работает с множеством других типов файлов. Мы также указываем, что у нас нет столбца индекса.

Затем мы ищем бюджет, содержащийся в 1-й строке (индексы Pandas начинаются с 0, как и Python) и в столбце «Бюджет», используя метод df.loc[row, column]. Это похоже на выбор элемента из списка. Обратите внимание, что вы можете переопределить индекс по умолчанию в Pandas и сделать свой индекс, используя строки, числа и т. Д. Тогда row должен ссылаться на ваш недавно созданный индекс. Итак, набираем df.loc[0, “budget”].

Если файл не найден, мы просто устанавливаем наш бюджет на 0 и создаем новый фрейм данных Pandas, который имеет только один столбец и одну строку, используя метод pd.DataFrame({key: [value, value2...], key2: [value3, value4...]...}) . Это похоже на создание словаря с ключами, которые являются просто именами столбцов.

# Take user input and store it in an integer
user_intent = ""
while user_intent != "quit":
    user_intent = str.lower(input('''What would you like to do      
    today?\n'''))
    if user_intent == "expense":
        expense = int(input("How much did you spend?\n"))
        budget -= expense
        print(f"Expense of BDT {expense} deducted\n")
    elif user_intent == "salary":
        salary = int(input("How much did you get?\n"))
        budget += salary
        print(f"Salary payment of BDT {salary} added\n")
    elif user_intent == "budget":
        print(f"Your current budget is {budget}\n")
    elif user_intent == "quit":
        print("Quitting the application")
        df.loc[0, "Budget"] = budget
        df.to_csv("budget.csv", index=False)
    else:
        print("You typed something wrong.\n")

Эта часть сначала кажется сложной, но ее разбивка показывает довольно простую систему пользовательского ввода. Сначала мы создаем пустую строку и инициализируем цикл while. Пока пользователь не наберет “quit”, цикл while будет продолжаться.

В начале цикла он попросит пользователя что-то ввести. str.lower() переводит ввод в нижний регистр. Это на тот случай, если пользователь напортачит и наберет любую букву в верхнем регистре. \n в строке работает аналогично нажатию клавиши ВВОД в документе. Дополнительное раздражение заключается в том, что при вводе “\” внутри строк не появляется косая черта, и вместо этого вам нужно вводить "\\".

Если введено “expense”, мы просим пользователя ввести сумму расходов и вычесть ее из нашего бюджета. Обратите внимание, что мы можем вернуть ошибку, если пользователь введет что-нибудь, кроме числа. Попробуйте реализовать это самостоятельно.

Если введено “salary”, мы просим сумму и добавляем ее в наш бюджет.

Если введено “budget”, мы показываем пользователю текущий бюджет.

Если введено “quit”, то мы сохраняем нашу бюджетную переменную внутри фрейма данных и сохраняем ее на нашем компьютере (в том же каталоге, что и скрипт Python, который мы запускаем), используя метод dataframe.to_csv(name). Мы также говорим Pandas отказаться от индекса, поскольку он автоматически создается при открытии файла. Обратите внимание, что когда мы открыли фрейм данных, мы вызвали метод read_csv в самом Pandas: pd.read_csv(name), а при закрытии мы вызываем метод в фрейме данных: df.to_csv(name). Ввод "quit" также останавливает цикл.

Если введено что-то еще, мы возвращаем сообщение об ошибке.

Полный код приведен ниже, а также доступен в вышеупомянутом репозитории Github:

Деньги управляются лучше

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

Для еще более совершенной системы мы могли бы добавить онлайн-хранилище в виде Google Таблиц (будущая статья?) Или сделать все возможное и использовать полнофункциональную онлайн-базу данных, такую ​​как Google Cloud. Мы могли бы даже добавить графический интерфейс и сделать его больше похожим на компьютерное приложение.

Другие варианты использования включают в себя необходимость рассчитать вкладку после НДС и платы за обслуживание и разделить ее между моими друзьями в ресторанах, посмотреть, сколько дней у меня осталось до того, как у меня закончатся деньги из-за моих чрезмерных расходов, и визуализировать свои привычки тратить. Все это возможно с Python, и это тоже на удивление легко!

Слияние файлов Excel

Не знаю, как вы, но по какой-то причине мне время от времени приходилось объединять до 50 файлов Excel во время двух стажировок в двух фирмах. В то время как некоторых других практикантов раздражало неиспользование Google Таблиц, я просто сделал небольшой скрипт, чтобы сделать это за меня. Этот сценарий также работает с другими типами файлов с небольшими изменениями. Код здесь был во многом вдохновлен этой статьей из фантастического блога под названием Практический бизнес-Python.

Мы создадим сценарий, который принимает:

  • Входной каталог, содержащий все необходимые нам файлы в формате CSV.
  • Выходной каталог.
  • Имя объединенного файла CSV.

Сценарий игнорирует строку заголовка (1-я строка) и просто объединяет содержимое всех наборов данных. Итак, в идеале у нас есть файлы CSV с одинаковым количеством столбцов и одинаковыми именами столбцов в том же порядке. Хотя, приложив немного больше усилий, вы можете избавиться от этих ограничений!

Давайте импортируем несколько библиотек. Pathlib позволяет нам использовать функцию Path, которая полезна, поскольку пути к файлам различаются в Mac, Windows и Linux. Модуль ОС будет использоваться для вывода списка всех файлов в каталоге.

# Some helpful libraries
from pathlib import Path
import pandas as pd
import os

Затем мы создаем функцию, которая объединяет файлы, принимающие 3 входа: исходный каталог, выходной каталог и имя выходного файла.

def combine_excel(source, destination, output_file):
    # make an empty dataframe
    df_combined = pd.DataFrame()
    # Create a path variable from the source directory name and
    # use the listdir function from the os library
    input_dir = os.listdir(Path(source))
    for files in input_dir:
        df = pd.read_csv(Path(source + '/' + files))
        df_combined = pd.concat([df_combined,df],ignore_index=True)
    df_combined.to_csv(
        Path(destination + '/' + output_file + ".csv"), index=False)
    print("File Saved")

os.listdir(path) позволяет нам создать список всех имен файлов внутри папки. Затем мы читаем имена файлов, обязательно добавляя имя исходного каталога с / и имя файла. Чтобы проиллюстрировать, почему это необходимо, рассмотрим следующий пример: наш исходный каталог - это E:\Excelmerger , а файлы внутри него - это b.csv и c.csv. Когда мы перебираем файлы, мы берем источник (E:\Excelmerger), добавляем / и имя текущего файла (b.csv), чтобы получить E:\Excelmerger\b.csv, который является правильным путем к файлу.

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

pd.concat([df1, df2, df3…]) function из библиотеки Pandas используется для объединения двух фреймов данных. Это создаст новый фрейм данных, который по умолчанию предполагает, что заголовок такой же, и объединяет строки. Мы также говорим ему игнорировать индекс, поскольку порядок в нашем случае не имеет значения; нам просто нужно, чтобы данные в файлах отображались один за другим (это имело бы значение, нужен ли нам определенный порядок между несколькими наборами данных).

При сохранении файла не забудьте добавить расширение в конце.

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

def validate_inputs(source, destination, output_file):
    # Assume there are no errors & error message is nonexistent
    errors = False
    error_message = []
    # Path turns the source directory into a path variable that has 
    # a method called exists() that checks if its valid
    # If the path doesn't exist, there is an error
    if not (Path(source)).exists():
        errors = True
        error_message.append("Please select an input directory")
    # This is similar to the above but for output directory
    if not (Path(destination)).exists():
        errors = True
        error_message.append("Please select an output directory")
    # This checks if the length of the output file is less than 1
    # if it is 0 characters, that means field is empty
    if len(output_file) < 1:
        errors = True
        error_message.append("Please enter a file name")
    # This returns the errors boolean and the error message string 
    return(errors, error_message)

Новые используемые функции включают Path.exists(), который проверяет, действителен ли путь к файлу, и str.append(), который позволяет нам добавлять слова в строку. Мы также используем функцию len(string), чтобы узнать, набрал ли пользователь что-то.

# These take the inputs from the intent
source = input("Input_Directory: \n").replace('"', '')
destination = input("Output_Directory: \n").replace('"', "")
output_file = input("Output_Name: \n").replace('"', "")
# This triggers the validate input function 
errors, error_message = validate_inputs(source, destination, output_file)
# If validate inputs returns an error, show the error message
# corresponding to that error
if errors:
    print("Error: " + error_message)
else:
    combine_excel(source, destination, output_file)

Обратите внимание, что мы добавляем str.replace('old', 'new'), когда принимаем входные данные. Это удаляет любые в нашем пути к файлам, которые возникают, когда мы перетаскиваем папки на терминал. Да, вы можете перетащить каталоги ввода и вывода в окно терминала, если вам не хочется печатать!

Как насчет липкого?

Помните тот графический интерфейс, о котором мы постоянно говорили? Давай добавим. Мы будем использовать простую в использовании библиотеку под названием appJar. Установите его, набрав pip install appjar в командной строке Anaconda или в терминале.

В приведенном ниже коде много улучшений: средство проверки ошибок, которое проверяет, что все файлы в исходном каталоге являются файлами CSV, и общие улучшения, добавленные графическим интерфейсом, такие как кнопка выхода, традиционный выбор путей к файлам (при установке программного обеспечения и он запрашивает каталог установки) и так далее.

Чтобы полностью понять, как работает приведенный ниже код, вам может потребоваться документация по appJar.

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

Вам также следует попытаться реализовать эти блоки кода самостоятельно и найти все, что вас смущает в этой статье, в документации библиотеки, Переполнении стека или просто в старом обычном Google. Обучение на примерах, самостоятельная реализация кода и исправление ошибок - это ключевой навык!

Небольшое обновление - я сделал этот курс еще на бакалавриате, чтобы преподавать основы программирования людям, не имеющим технического образования. Однако я закончил обучение (ура) и из-за нехватки времени не смог продолжить эту серию. Если вы чувствуете, что я вам помог, напишите мне по адресу [email protected] и дайте мне знать! Может быть, ваши письма побудят меня закончить серию!