如何使用python从csv文件中删除指定行

如何使用python从csv文件中删除指定行,python,csv,Python,Csv,我正在开发一个程序,并试图实现以下功能 添加新学生 基于id删除学生 这是我的密码 from csv import writer import csv def add(file_name, list_of_elem): # Open file in append mode with open(file_name, 'a+', newline='') as write_obj: # Create a writer object from csv module

我正在开发一个程序,并试图实现以下功能

  • 添加新学生
  • 基于id删除学生
这是我的密码

from csv import writer
import csv

def add(file_name, list_of_elem):
    # Open file in append mode
    with open(file_name, 'a+', newline='') as write_obj:
        # Create a writer object from csv module
        csv_writer = writer(write_obj)
        # Add contents of list as last row in the csv file
        csv_writer.writerow(list_of_elem)

def remove():
    id = input("Enter ID : ")
    with open('students.csv', 'rb') as inp, open('students.csv', 'wb') as out:
        writer = csv.writer(out)
        for row in csv.reader(inp):
            if row[0] != id:
                writer.writerow(row)


# List of strings
row_contents = [11,'mayur','Java','Tokyo','Morning']
# Append a list as new line to an old csv file
add('students.csv', row_contents)
remove()


“添加”功能正常工作,但当我尝试“删除”功能时,它会删除所有现有条目。请任何人帮助我。

首先,我将显示代码,下面我将对更改留下一些注释

from csv import writer
import csv

def add(file_name, list_of_elem):
    # Open file in append mode
    with open(file_name, 'a+', newline = '') as write_obj:
        # Create a writer object from csv module
        csv_writer = writer(write_obj)
        # Add contents of list as last row in the csv file
        csv_writer.writerow(list_of_elem)

def remove():
    idt = input("Enter ID : ")
    with open('students.csv', 'r') as inp:
        newrows = []
        data = csv.reader(inp)
        for row in data:
            if row[0] != idt:
                newrows.append(row)
    with open('students.csv', 'w') as out:
        csv_writer = writer(out)
        for row in newrows:
            csv_writer.writerow(row)

def display():
    with open('students.csv','r') as f:
        data = csv.reader(f)
        for row in data:
                print(row)

# List of strings
row_contents = [10,'mayur','Java','Tokyo','Morning']
add('students.csv', row_contents)
row_contents = [11,'mayur','Java','Tokyo','Morning']
add('students.csv', row_contents)
row_contents = [12,'mayur','Java','Tokyo','Morning']
add('students.csv', row_contents)
# Append a list as new line to an old csv file

display()
remove()
  • 如果您的文件是CSV,您应该使用
    文本
    文件,而不是
    二进制
    文件
  • 我将变量
    id
    的名称更改为
    ìdt
    ,因为
    id
    是内置的,用于返回对象的标识,覆盖内置函数不是一个好做法
  • 要仅删除具有特定
    idt
    的行,应读取所有文件,存储到var(列表)中,删除要删除的内容,然后保存结果

  • 首先我将展示代码,下面我将留下一些关于更改的评论

    from csv import writer
    import csv
    
    def add(file_name, list_of_elem):
        # Open file in append mode
        with open(file_name, 'a+', newline = '') as write_obj:
            # Create a writer object from csv module
            csv_writer = writer(write_obj)
            # Add contents of list as last row in the csv file
            csv_writer.writerow(list_of_elem)
    
    def remove():
        idt = input("Enter ID : ")
        with open('students.csv', 'r') as inp:
            newrows = []
            data = csv.reader(inp)
            for row in data:
                if row[0] != idt:
                    newrows.append(row)
        with open('students.csv', 'w') as out:
            csv_writer = writer(out)
            for row in newrows:
                csv_writer.writerow(row)
    
    def display():
        with open('students.csv','r') as f:
            data = csv.reader(f)
            for row in data:
                    print(row)
    
    # List of strings
    row_contents = [10,'mayur','Java','Tokyo','Morning']
    add('students.csv', row_contents)
    row_contents = [11,'mayur','Java','Tokyo','Morning']
    add('students.csv', row_contents)
    row_contents = [12,'mayur','Java','Tokyo','Morning']
    add('students.csv', row_contents)
    # Append a list as new line to an old csv file
    
    display()
    remove()
    
  • 如果您的文件是CSV,您应该使用
    文本
    文件,而不是
    二进制
    文件
  • 我将变量
    id
    的名称更改为
    ìdt
    ,因为
    id
    是内置的,用于返回对象的标识,覆盖内置函数不是一个好做法
  • 要仅删除具有特定
    idt
    的行,应读取所有文件,存储到var(列表)中,删除要删除的内容,然后保存结果

  • 您应该使用临时文件,而不是同时打开和写入同一文件。签出此答案:

    您应该使用临时文件,而不是同时打开和写入同一文件。查看此答案:

    谢谢@j3r3mias!谢谢@j3r3mias!