Невозможно удалить одну строку в файле CSV после метода удаления, весь файл очищается - PullRequest
0 голосов
/ 06 августа 2020

Я хочу удалить строку из моего файла csv, но после использования метода remove весь файл становится пустым. Какие изменения мне нужно сделать, чтобы удалить строку в соответствии с данными college id?

import csv

class College:

    def addclg(self):
        with open('colleges.csv', 'a', newline='') as fp:
            a=csv.writer(fp)
            id = input("Enter College ID:")
            name = input("Enter College Name:")
            course = input("Enter Course:")
            city = input("Enter your City:")
            fees = input("Enter your Fess:")
            pin = input("Enter your Pincode:")
            a.writerow([id, name, course, city, fees, pin])
            fp.close()

    def display(self):
        with open('colleges.csv', 'r') as fp:
            a=csv.reader(fp)
            for row in a:
                if row[3]=='Mumbai' and row[2]=='Engineering' :
                    print (row)
        fp.close()

    def remove(self):
        data=list()
        with open('colleges.csv', 'r') as fp2:
            a2=csv.reader(fp2)
            for row2 in a2:
                print (row2[0],row2[1])
            id = input("Enter College ID you want to delete:")
            for row2 in a2:
                data.append(row2)
                for field in row2:
                    if field == id:
                        data.remove(row2)
        with open('colleges.csv', 'w') as fp:
            a=csv.writer(fp)
            a.writerow(data)
        fp.close()
        fp2.close()

ch=input('a. Register New College\nb. Display colleges in Mumbai who teach Engineering\nc. Remove College Based on collegeid\nEnter your Choice: ')
obj1=College()
if (ch=='a'):
    obj1.addclg()
elif(ch=='b'):
    obj1.display()
elif(ch=='c'):
    obj1.remove()
else:
    print('Wrong Choice')

файла csv: 111, KJSomaiya College, Engineering, Mumbai, 10000,400077 222, Dr. Колледж Васантрао Павар, медицинский, Нашик, 20000, 422207

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Почему вы не используете здесь pandas? Я предполагаю, что в вашем csv есть столбец под названием «Идентификатор колледжа».

import pandas as pd
df = pd.read_csv('colleges.csv')
id = input("Enter College ID you want to delete:")

df = df[df["College ID"]!=id].reset_index(drop=True)
df.to_csv("colleges_filtered.csv", index=False)
0 голосов
/ 06 августа 2020

ваш лог c кажется нормальным, но есть «трюк» в методе csv.reader () .

Это специальный метод, называемый генератором , и его элементы могут быть вызваны только один раз.

Итак, мы могли бы запустить a2=csv.reader(fp2) второй раз после первого l oop верно?

Но fp2 тоже генератор! Так что вы тоже ничего не получите.

Самый простой - сохранить набор результатов в переменной, использовать данные на первой итерации:

def remove(self):

    data=list()

    with open('colleges.csv1', 'r') as fp2:

        a2=csv.reader(fp2)

        for row2 in a2:
            data.append(row2) # Filling up data as we print it
            print (row2[0],row2[1])

   id = input("Enter College ID you want to delete:")
   
   # Than just iterate over data
   for row in data:
       for field in row:
           if field == id:
              data.remove(row2)

   with open('colleges.csv', 'w') as fp:
       a=csv.writer(fp)
       a.writerow(data)
...