#python #python-3.x #export-to-csv
#python #python-3.x #экспорт в csv
Вопрос:
Я новичок в python, пытающийся понять логику и решение этой проблемы.В упражнении говорится о создании приложения для заказа для кафе.
import uuid # GET A RANDOM ID FOR THE CUSTOMER
from datetime import date # GET CURRENT DATE
from csv import DictWriter
inlist = -1
length = 0
Total_Amount = 0.0
CustomerList = []
AddressList = []
Today_Key = date.toordinal(date.today())
Today_Date = date.today()
Print_Today = Today_Date
Customers = {}
Dates = {}
FirstEmployeeAccountUsername = "coffee1"
FirstEmployeeAccountPassword = "coffeeshop1"
SecondEmployeeAccountUsername = "coffee2"
SecondEmployeeAccountPassword = "coffeeshop2"
ThirdEmployeeAccountUsername = "coffee3"
ThirdEmployeeAccountPassword = "coffeeshop3"
print("Welcome to our coffee shop!")
print("Login")
# EMPLOYEE LOGIN PROCESS STARTS
LoginEnter = True
while LoginEnter:
username = input("Username: ")
password = input("Password: ")
if username == FirstEmployeeAccountUsername and password == FirstEmployeeAccountPassword or username == SecondEmployeeAccountUsername and password == SecondEmployeeAccountPassword or username == ThirdEmployeeAccountUsername and password == ThirdEmployeeAccountPassword:
print("Login Successful")
LoginEnter = False
else:
print("Invalid Login. Try again")
# EMPLOYEE LOGIN PROCESS ENDS
# PROCESS AFTER ORDER PLACEMENT STARTS
process1 = True
process2 = True
while process1:
while process2:
Customer_Name = input("Customer's Name:")
CustomerList.append(Customer_Name)
Customers_Address = input("Customer's Address:")
AddressList.append(Customers_Address)
if Today_Key not in Dates:
Dates[Today_Key] = {}
if Customer_Name not in Dates[Today_Key]:
Dates[Today_Key][Customer_Name] = 1
else:
Dates[Today_Key][Customer_Name] = 1
if Customer_Name in Customers:
Customers[Customer_Name]['Orders'] = 1
Customers[Customer_Name]['TotalAmount'] = Total_Amount
else:
Customers[Customer_Name] = {}
Customers[Customer_Name]['Address'] = Customers_Address
Customers[Customer_Name]['ID'] = uuid.uuid1()
Customers[Customer_Name]['Orders'] = 1
Customers[Customer_Name]['TotalAmount'] = 0
print(Customer_Name, "has ordered {} time(s)".format(Customers[Customer_Name]['Orders']))
if Customers[Customer_Name]['TotalAmount'] == 0:
print("This is the first time", Customer_Name, "orders")
else:
print(Customer_Name, "has spent", Customers[Customer_Name]['TotalAmount'], "in total")
print("Current Date is: {}".format(Today_Date))
Order_Price = float(input("Total amount of order:"))
Total_Amount = Order_Price Total_Amount
if Print_Today != Today_Date:
print("Total amount of orders today is: ", float(Total_Amount))
answer1 = input("Send another order? (Y/N)").lower()
if answer1 == "y":
process2 = True
else:
process2 = False
LengthCustomersList = len(CustomerList)
length = 1
inlist = 1
file = open('CustomerNames.txt', 'w')
file.write(str(CustomerList[0:]) 'n') # TAKE CARE FOR DUPLICATE NAMES FROM SAME ADDRESS
file.close()
file1 = open('Orders_Per_Users.txt', 'a')
file1.write(Customer_Name " has ordered " str(
Customers[Customer_Name]['Orders']) " times in totaln") # FIX DUPLICATES SAME NAME SAME ADDRESS
file1.close()
with open('data_entered.csv', 'a') as f:
csv_writer = DictWriter(f, fieldnames=['Customer Name', 'Customer Address', 'Customer ID', 'Total Orders',
'Total Amount'])
csv_writer.writeheader()
csv_writer.writerows([{'Customer Name': CustomerList[inlist], 'Customer Address': AddressList[inlist],
'Customer ID': Customers[Customer_Name]['ID'],
'Total Orders': Customers[Customer_Name]['Orders'],
'Total Amount': Customers[Customer_Name]['TotalAmount']}])
if int(length) == int(LengthCustomersList):
process1 = False
Моя идея состоит в том, чтобы сделать что-то вроде инструкции if, чтобы, когда в файле .csv отображаются один и тот же идентификатор клиента и одно и то же имя пользователя, один из них удаляется, поэтому файл не содержит дубликатов, подобных тем, что на скриншоте выше.
Комментарии:
1. если вы можете использовать
pandas
библиотеку, я думаю, вы могли бы сэкономить много проблем с кодом.2. Хм, я никогда об этом не слышал. Не могли бы вы предоставить ссылку?
3. pandas.pydata.org
4. Я вижу, что мне нужно выполнить установку. Это задание, которое я должен отправить своему профессору, если я использую библиотеку pandas, должен ли мой профессор также установить ее (если у него ее еще нет), чтобы она работала?
5. рекомендация: вы можете поменять это
if answer1 == "y": process2 = True else: process2 = False
сprocess2 = answer1 == "y"
Ответ №1:
Я не уверен, что мы в конечном итоге решим ваш вопрос, но я хотел бы дать вам некоторые исходные данные, которые вы можете использовать для исправления своего кода.
- Использование переменной
Today_Date
иPrint_Today
в вашем коде
Today_Date = date.today()
Print_Today = Today_Date
if Print_Today != Today_Date:
Для этих двух строк установлено одинаковое значение. Позже в коде вы проверяете, не равны ли они. Я проверил Print_Today
и Today_Date
для переназначения. Ничего не происходит. Итак, как вы ожидаете, что эти две переменные будут иметь разные значения?
Если эта программа выполняется бесконечное количество дней, она все равно НЕ изменит значение этих двух переменных. Причина в том, что они были определены в начале программы и никогда не менялись. Возможно, вы захотите изучить это.
- Использование
Today_Key
inDates
dictionary в вашем коде.
Today_Key = date.toordinal(date.today())
Dates = {}
Вы используете Today_Key
для подсчета количества раз, когда было введено имя клиента. Я не вижу смысла иметь в Today_Key
качестве ключа, если вы не планируете иметь более одного ключа в словаре. Это было установлено в начале программы и никогда не менялось. Итак, что вы собираетесь делать с этим ключом? Я не думаю, что у вас должно быть это как ключ. Вместо этого вы должны просто отслеживать имена клиентов. Кроме того, вы не печатаете и не записываете эту информацию в файл. Собираетесь ли вы использовать это позже в программе? Я не вижу значения, и это может просто занять место в памяти и время обработки.
- Использование нескольких имен для имени пользователя и пароля.
Вы создали 6 переменных для хранения имени пользователя и пароля. В других местах вы используете dictionary . Итак, почему вы не используете словарь здесь?
FirstEmployeeAccountUsername = "coffee1"
FirstEmployeeAccountPassword = "coffeeshop1"
SecondEmployeeAccountUsername = "coffee2"
SecondEmployeeAccountPassword = "coffeeshop2"
ThirdEmployeeAccountUsername = "coffee3"
ThirdEmployeeAccountPassword = "coffeeshop3"
Вместо этого вы не можете просто определить переменную dict и проверить значение, как показано ниже?
UserLogin = {"coffee1":"coffeeshop1", "coffee2": "coffeeshop2", "coffee3": "coffeeshop3"}
username = password = ''
while True:
username = input("Username: ")
password = input("Password: ")
if (username in UserLogin) and (UserLogin[username] == password):
print("Login Successful")
break
else:
print("Invalid Login. Try again")
- Для вашей части счетчика имен клиентов попробуйте это. Я не думаю, что вы на самом деле что-то делаете со счетчиком. Если да, то этот код намного проще.
CustomerCounts = defaultdict(int)
while True:
Customer_Name = input("Customer's Name:")
CustomerList.append(Customer_Name)
Customers_Address = input("Customer's Address:")
AddressList.append(Customers_Address)
CustomerCounts[Customer_Name] = 1
аналогичным образом, попробуйте использовать defaultdict и сократите объем написанного вами кода. В конце концов, вы можете выполнить множество оптимизаций кода и логических исправлений. Однако это не решает ситуацию с бесконечным циклом.
Комментарии:
1. Я отвечу вам, потому что у меня есть кое-какие дела и дела, которые нужно сделать.