Как я могу удалить строку из файла .csv

#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:

Я не уверен, что мы в конечном итоге решим ваш вопрос, но я хотел бы дать вам некоторые исходные данные, которые вы можете использовать для исправления своего кода.

  1. Использование переменной Today_Date и Print_Today в вашем коде
     Today_Date = date.today()
    Print_Today = Today_Date
    
    if Print_Today != Today_Date:
 

Для этих двух строк установлено одинаковое значение. Позже в коде вы проверяете, не равны ли они. Я проверил Print_Today и Today_Date для переназначения. Ничего не происходит. Итак, как вы ожидаете, что эти две переменные будут иметь разные значения?

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

  1. Использование Today_Key in Dates dictionary в вашем коде.
     Today_Key = date.toordinal(date.today())
    Dates = {}
 

Вы используете Today_Key для подсчета количества раз, когда было введено имя клиента. Я не вижу смысла иметь в Today_Key качестве ключа, если вы не планируете иметь более одного ключа в словаре. Это было установлено в начале программы и никогда не менялось. Итак, что вы собираетесь делать с этим ключом? Я не думаю, что у вас должно быть это как ключ. Вместо этого вы должны просто отслеживать имена клиентов. Кроме того, вы не печатаете и не записываете эту информацию в файл. Собираетесь ли вы использовать это позже в программе? Я не вижу значения, и это может просто занять место в памяти и время обработки.

  1. Использование нескольких имен для имени пользователя и пароля.

Вы создали 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")
 
  1. Для вашей части счетчика имен клиентов попробуйте это. Я не думаю, что вы на самом деле что-то делаете со счетчиком. Если да, то этот код намного проще.
     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. Я отвечу вам, потому что у меня есть кое-какие дела и дела, которые нужно сделать.