Ремесла за десять минут
Это 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] и дайте мне знать! Может быть, ваши письма побудят меня закончить серию!