AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79595292
Accepted
Emerson Cox
Emerson Cox
Asked: 2025-04-28 01:35:35 +0800 CST2025-04-28 01:35:35 +0800 CST 2025-04-28 01:35:35 +0800 CST

Como posso excluir uma linha de um arquivo csv?

  • 772

insira a descrição da imagem aqui insira a descrição da imagem aqui

Quando tento excluir uma linha do meu arquivo CSV, ele exclui todo o resto e, em seguida, inverte a linha e separa os caracteres em suas próprias colunas. Não tenho ideia do que está acontecendo. Acima, estão as imagens que mostram o antes e o depois do meu arquivo CSV quando tento excluí-lo. Não tenho ideia do que está acontecendo e é muito estranho. Aqui está meu código e o problema está na linha 95:

import csv
import sys

FILENAME = "guests.csv"

def exit_program():
    print("Terminating program.")
    sys.exit()

def read_guests():
    try:
        guests = []
        with open(FILENAME, newline="") as file:
            reader = csv.reader(file)
            for row in reader:
                guests.append(row)
        return guests
    except FileNotFoundError as e:
##        print(f"Could not find {FILENAME} file.")
##        exit_program()
        return guests
    except Exception as e:
        print(type(e), e)
        exit_program()

def write_guests(guests):
    try:
        with open(FILENAME, "w", newline="") as file:
##            raise BlockingIOError("Error raised for testing.")
            writer = csv.writer(file)
            writer.writerows(guests)
    except OSError as e:
        print(type(e), e)
        exit_program()
    except Exception as e:
        print(type(e), e)
        exit_program()

def list_guests(guests):
    number_of_guests = 0
    number_of_members = 0
    total_fee = 0
    for i, guests in enumerate(guests, start=1):
        print(f"{i}. Name:        {guests[0]} {guests[1]}\n   Meal:        {guests[2]} \n   Guest Type:  {guests[3]} \n   Amount due:  ${guests[4]}")
        if guests[3] == "guest":
            number_of_guests +=1
        if guests[3] == "member":
            number_of_members +=1
        total_fee += 22
              
    print("Number of members: " +str(number_of_members))
    print("Number of guests: " +str(number_of_guests))
    print("Total fee paid by all attendees: " +str(total_fee))
    print()
    
def add_guests(guests):
    fname = input("First name: ")
    lname = input("Last name: ")
    while True:
        try:
            meal = str(input("Meal(chicken, vegetarian, or beef): "))
        except ValueError:
            print("Please enter a meal. Please try again.")
            continue
        if meal == "beef" :
            break
        if meal == "chicken" :
            break
        if meal == "vegetarian" :
            break
        else:
            print("Please enter a meal:(chicken, vegetarian, or beef)")

    while True:
        attendee_type = input("Are you a 'member' or 'guest'?")
        if attendee_type == "member" :
            break
        if attendee_type == "guest" :
            break
        else:
            print("Please enter either 'member' or 'guest': ")
    fee = 22
    
    
    guest = [fname, lname, meal, attendee_type, fee]
    guests.append(guest)
    write_guests(guests)
    print(f"{fname} was added.\n")

def delete_guest(guests):

    name = input("Enter the guest's first name: ")
    for i, guests in enumerate(guests, start=1):
        if name == guests[0]:
            del guests[i]

            write_guests(guests)
                
            print(f"{name} removed from catalog.")
            print("")
            break
    print(f"{name} doesn't exist in the list.")

def menu_report(guests):
    number_of_beef = 0
    number_of_chicken = 0
    number_of_vegetarian = 0
    for i, guests in enumerate(guests, start=1):
        if guests[2] == "beef":
            number_of_beef +=1
        if guests[2] == "chicken":
            number_of_chicken +=1
        if guests[2] == "vegetarian":
            number_of_vegetarian +=1
              
    print("Number of Chicken entrees: " +str(number_of_chicken))
    print("Number of Beef entrees: " +str(number_of_beef))
    print("Number of vegetarian Meals: " +str(number_of_vegetarian))
    print()

def display_menu():
    print("COMMAND MENU")
    print("list - List all guests")
    print("add -  Add a guest")
    print("del -  Delete a guest")
    print("menu - Report menu items")
    print("exit - Exit program")
    print()    

def main():
    print("The Guests List program")
    print("")
    guests = read_guests()
    while True:
        display_menu()
        command = input("Command: ")
        if command.lower() == "list":
            list_guests(guests)
        elif command.lower() == "add":
            add_guests(guests)
        elif command.lower() == "del":
            delete_guest(guests)
        elif command.lower() == "menu":
            menu_report(guests)
        elif command.lower() == "exit":
            break
        else:
            print("Not a valid command. Please try again.\n")
    print("Bye!")
    quit()

if __name__ == "__main__":
    main()

Isto é para uma tarefa que vence amanhã! arg!

Pensei que ele excluiria a linha, mas, em vez disso, ele salvou apenas essa linha e transformou cada entrada em uma coluna dessa linha em sua própria linha. Cada caractere na linha original agora estava separado em sua própria coluna.

python
  • 2 2 respostas
  • 37 Views

2 respostas

  • Voted
  1. viacrucis
    2025-04-28T01:45:04+08:002025-04-28T01:45:04+08:00

    No seu loop for, você está reutilizando o nome da variável guests, o mesmo nome da sua lista de todos os guests.
    Isso sobrescreve a lista dentro do loop e causa um comportamento inesperado.

    Os convidados dentro do loop referem-se a uma única linha de convidado, não mais à lista completa. Ao tentar deletar guests[i], você está excluindo um índice de uma única linha (ou até mesmo uma string, caso tenha sido corrompida). Como resultado, ao chamar write_guests(guests) posteriormente, ele grava dados inválidos no arquivo, causando o problema de "texto lateral" que você descreveu. Você pode corrigir isso alterando o nome da variável do loop para algo diferente, como "guest".
    Aqui está uma versão corrigida usando guest como uma variável de loop nomeada.

    def delete_guest(guests):
        name = input("Enter the guest's first name: ")
        for i, guest in enumerate(guests):
            if name == guest[0]:
                del guests[i]
                write_guests(guests)
                print(f"{name} removed from catalog.")
                print("")
                break
        else:
            print(f"{name} doesn't exist in the list.")
    
    • 0
  2. Best Answer
    J_H
    2025-04-28T01:49:36+08:002025-04-28T01:49:36+08:00

    evitar sombreamento

    Use identificadores singulares e plurais quando apropriado. A expressão usual é
    for x in xs:

    Você escreveu:

        for i, guests in enumerate(guests, start=1):
            if name == guests[0]:
                del guests[i]
    

    O que você queria escrever erafor i, guest in ...

    Ao testar namea igualdade, você pretendia se referir a guest[0], a primeira coluna de uma linha.

    Infelizmente, a nova guestsvariável local está ocultando o guestsparâmetro original. Como resultado, esse parâmetro não está mais acessível dentro do corpo do loop.

    sofrer mutação fora do loop

    Recomendo atribuir condicionalmente match_index = i dentro do loop e emitir del guests[match_index] depois que o forloop terminar.

    Além disso, é uma pena que o programa não verifique se o nome de cada convidado é único.

    Se você deseja filtrar por um atributo não exclusivo, como remover convidados que comeram "carne", considere criar uma nova lista filtrada e retorná-la. Isso evita pular linhas que possam corresponder.

    normalizar primeiro

            command = input("Command: ")
    

    É melhor diminuir isso imediatamente.

            command = input("Command: ").lower()
    

    Assim, você pode evitar várias .lower() chamadas distrativas nos testes de despacho subsequentes.

    • 0

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve