将数据附加到 .csv 文件

问题描述 投票:0回答:1

text 以下谷歌文档包含我的代码的屏幕截图以及说明。我现在遇到的问题是,并非所有数据都被附加到 .csv 文件中。当我输入所有字段来添加学生时,只有 SID、名字、姓氏被传递到 .csv 文件。

我尝试通过以下方式附加数据: 使用 CSV writer() 方法将数据附加到 Python 中的 csv 文件 使用 CSV DictWriter() 方法将数据附加到 Python 中的 csv 文件 使用 pandas 将数据附加到 Python 中的 csv 文件

这是代码:

    import tkinter as tk
    from tkinter import ttk
    from tkinter import filedialog  # Import filedialog from tkinter
    import pandas as pd
    from tkinter.filedialog import askopenfile
    import csv
    import numpy as np  # Required for handling NaN values


    # Define global variables to store and manipulate data
    student_data = []
    imported_data = ""  # Store the imported data

    def import_data():
        # Open a CSV file dialog and get the selected file
        file = askopenfile(mode='r', filetypes=[('CSV Files', '*.csv')])

        if file:
            # Use pandas to read the CSV file
            df = pd.read_csv(file)
            
            # Iterate over the rows in the DataFrame
            for _, row in df.iterrows():
                student_info = {
                    'SID': row['SID'],
                    'FirstName': row['FirstName'],
                    'LastName': row['LastName'],
                    'Email': row['Email'],
                    'Homeworks(hw1, hw2, hw3)': [str(row[f'HW{i}']) for i in range(1, 4)],
                    'Quizzes(quiz1, quiz2, quiz3, quiz4)': [str(row[f'Quiz{i}']) for i in range(1, 5)],
                    'MidtermExam': str(row['MidtermExam']),
                    'FinalExam': str(row['FinalExam'])
                }
                
                # Display the student information in the text widget
                imported_text.insert(tk.END, f"SID: {student_info['SID']}\n")
                imported_text.insert(tk.END, f"FirstName: {student_info['FirstName']}\n")
                imported_text.insert(tk.END, f"LastName: {student_info['LastName']}\n")
                imported_text.insert(tk.END, f"Email: {student_info['Email']}\n")
                imported_text.insert(tk.END, f"Homeworks(hw1, hw2, hw3): {', '.join(student_info['Homeworks(hw1, hw2, hw3)'])}\n")
                imported_text.insert(tk.END, f"Quizzes(quiz1, quiz2, quiz3, quiz4): {', '.join(student_info['Quizzes(quiz1, quiz2, quiz3, quiz4)'])}\n")
                imported_text.insert(tk.END, f"MidtermExam: {student_info['MidtermExam']}\n")
                imported_text.insert(tk.END, f"FinalExam: {student_info['FinalExam']}\n")
                imported_text.insert(tk.END, "\n")  # Add a blank line to separate students


    def display_imported_data():
        # Clear the text box and insert the imported data
        imported_text.config(state=tk.NORMAL)  # Enable text widget for editing
        imported_text.delete(1.0, tk.END)
        imported_text.insert(tk.END, imported_data)
        imported_text.config(state=tk.DISABLED)  # Disable text widget for read-only

    def add_student():
        # Retrieve input values from the user
        sid = int(sid_entry.get()) if sid_entry.get() else 0  # Convert to integer or default to 0 if empty
        first_name = first_name_entry.get()
        last_name = last_name_entry.get()
        email = email_entry.get()
        
        # Retrieve homework scores from the input fields and validate
        hw1 = int(hw1_entry.get()) if hw1_entry.get() else 0  # Convert to integer or default to 0 if empty
        hw2 = int(hw2_entry.get()) if hw2_entry.get() else 0
        hw3 = int(hw3_entry.get()) if hw3_entry.get() else 0
        
        # Retrieve quiz scores from the input fields and validate
        quiz1 = int(quiz1_entry.get()) if quiz1_entry.get() else 0  # Convert to integer or default to 0 if empty
        quiz2 = int(quiz2_entry.get()) if quiz2_entry.get() else 0
        quiz3 = int(quiz3_entry.get()) if quiz3_entry.get() else 0
        quiz4 = int(quiz4_entry.get()) if quiz4_entry.get() else 0
        
        midterm = int(midterm_entry.get()) if midterm_entry.get() else 0  # Convert to integer or default to 0 if empty
        final = int(final_entry.get()) if final_entry.get() else 0

        # Call the add_student_data function with user inputs, including homework and quiz scores
        add_student_data(sid, first_name, last_name, email, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final)


    def add_student_data(sid, first_name, last_name, email, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final):
        global student_data
        
        # Create a new student record
        new_student = {
            'SID': sid,
            'FirstName': first_name,
            'LastName': last_name,
            'Email': email,
            'HW1': hw1,
            'HW2': hw2,
            'HW3': hw3,
            'Quiz1': quiz1,
            'Quiz2': quiz2,
            'Quiz3': quiz3,
            'Quiz4': quiz4,
            'MidtermExam': midterm,
            'FinalExam': final
        }
        
        # Add the new student to the data list
        student_data.append(new_student) 
        
        # Save the updated data to the CSV file
        save_data_to_csv()
        
    def clear_input_fields():
        # Clear input fields
        sid_entry.delete(0, 'end')
        first_name_entry.delete(0, 'end')
        last_name_entry.delete(0, 'end')
        email_entry.delete(0, 'end')
        hw1_entry.delete(0, 'end')
        hw2_entry.delete(0, 'end')
        hw3_entry.delete(0, 'end')
        quiz1_entry.delete(0, 'end')
        quiz2_entry.delete(0, 'end')
        quiz3_entry.delete(0, 'end')
        quiz4_entry.delete(0, 'end')
        midterm_entry.delete(0, 'end')
        final_entry.delete(0, 'end')

    def delete_student():
        # Retrieve input value (SID) from the user
        sid = int(delete_sid_entry.get())
        
        # Call the delete_student_data function with user input
        delete_student_data(sid)

    def delete_student_data(sid):
        # Open the original CSV file and a temporary CSV file
        with open('Student_data.csv', newline='') as csvfile, \
            open('Temp_Student_data.csv', mode='w', newline='') as temp_csvfile:
            csvFile = csv.DictReader(csvfile)
            fieldnames = csvFile.fieldnames

            # Create a CSV writer for the temporary file
            writer = csv.DictWriter(temp_csvfile, fieldnames=fieldnames)
            writer.writeheader()

            # Iterate through the original CSV and copy non-matching students to the temporary file
            for student in csvFile:
                if int(student['SID']) != sid:
                    writer.writerow(student)

        # Replace the original file with the temporary file
        import shutil
        shutil.move('Temp_Student_data.csv', 'Student_data.csv')

        # Clear input field
        delete_sid_entry.delete(0, 'end')

    def search_student():
        # Retrieve input value (SID) from the user
        sid = int(search_sid_entry.get())
        
        # Search for the student in the CSV file
        found_student = None

        with open('Student_data.csv', newline='') as csvfile:
            csvFile = csv.DictReader(csvfile)
            for student in csvFile:
                if int(student['SID']) == sid:
                    found_student = student
                    break
        
        if found_student:
            # Format the student data
            homeworks = [found_student[f'HW{i}'] for i in range(1, 4)]
            quizzes = [found_student[f'Quiz{i}'] for i in range(1, 5)]

            formatted_student = f"SID: {found_student['SID']}\n" \
                                f"FirstName: {found_student['FirstName']}\n" \
                                f"LastName: {found_student['LastName']}\n" \
                                f"Email: {found_student['Email']}\n" \
                                f"Homeworks: ({', '.join(homeworks)})\n" \
                                f"Quizzes: ({', '.join(quizzes)})\n" \
                                f"MidtermExam: {found_student['MidtermExam']}\n" \
                                f"FinalExam: {found_student['FinalExam']}"

            # Update the text box with the formatted student data
            searched_student_text.delete(1.0, tk.END)  # Clear previous content
            searched_student_text.insert(tk.END, formatted_student)
            
            result_label.config(text="Student found:")
        else:
            searched_student_text.delete(1.0, tk.END)  # Clear previous content
            searched_student_text.insert(tk.END, "Student not found")


    def search_student_data(sid, student_data):
        # Implement searching for a student by SID and return their data
        for student in student_data:
            if student['SID'] == sid:
                return student
        return None

    def update_scores():
        # Retrieve input values (SID and scores) from the user
        sid = int(update_sid_entry.get())
        hw1 = int(update_hw1_entry.get())
        hw2 = int(update_hw2_entry.get())
        hw3 = int(update_hw3_entry.get())
        quiz1 = int(update_quiz1_entry.get())
        quiz2 = int(update_quiz2_entry.get())
        quiz3 = int(update_quiz3_entry.get())
        quiz4 = int(update_quiz4_entry.get())
        midterm = int(update_midterm_entry.get())
        final = int(update_final_entry.get())
        
        # Call the update_scores_data function with user inputs
        update_scores_data(sid, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final)

    def update_scores_data(sid, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final):
        global student_data
        
        # Find the student by SID
        student_found = False
        for student in student_data:
            if student['SID'] == sid:
                student_found = True
                # Update the scores
                student['HW1'] = hw1
                student['HW2'] = hw2
                student['HW3'] = hw3
                student['Quiz1'] = quiz1
                student['Quiz2'] = quiz2
                student['Quiz3'] = quiz3
                student['Quiz4'] = quiz4
                student['MidtermExam'] = midterm
                student['FinalExam'] = final
                break
        
        if student_found:
            # Save the updated data to the CSV file
            save_data_to_csv()
        else:
            print("Student not found by SID")

    def export_data():
        # Implement exporting data to a .csv file
        pass

    def save_data_to_csv():
        global student_data
        
        # Specify the CSV file path
        csv_file_path = 'Student_data.csv'
        
        # Write the data to the CSV file in append mode
        with open(csv_file_path, mode='a', newline='') as csvfile:
            fieldnames = ['SID', 'FirstName', 'LastName', 'Email', 'HW1', 'HW2', 'HW3',
                        'Quiz1', 'Quiz2', 'Quiz3', 'Quiz4', 'MidtermExam', 'FinalExam']
            
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            
            # If the file is empty, write the header row
            if csvfile.tell() == 0:
                writer.writeheader()
            
            # Write the data for the new student to the CSV file
            for student in student_data:
                writer.writerow(student)


    # Create the main window
    root = tk.Tk()
    root.title("Gradebook System")

    # Create a notebook to organize different functionalities
    notebook = ttk.Notebook(root)
    notebook.pack(fill="both", expand=True)

    # Create tabs for each functionality
    import_tab = ttk.Frame(notebook)
    add_delete_tab = ttk.Frame(notebook)
    search_tab = ttk.Frame(notebook)
    update_tab = ttk.Frame(notebook)
    export_tab = ttk.Frame(notebook)

    notebook.add(import_tab, text="Import Data")
    notebook.add(add_delete_tab, text="Add/Delete Student")
    notebook.add(search_tab, text="Search Student")
    notebook.add(update_tab, text="Update Scores")
    notebook.add(export_tab, text="Export Data")

    # Add Student Tab
    sid_label = tk.Label(add_delete_tab, text="SID to Add:")
    sid_entry = tk.Entry(add_delete_tab)

    first_name_label = tk.Label(add_delete_tab, text="FirstName:")
    first_name_entry = tk.Entry(add_delete_tab)

    last_name_label = tk.Label(add_delete_tab, text="LastName:")
    last_name_entry = tk.Entry(add_delete_tab)

    email_label = tk.Label(add_delete_tab, text="Email:")
    email_entry = tk.Entry(add_delete_tab)

    hw1_label = tk.Label(add_delete_tab, text="HW1:")
    hw1_entry = tk.Entry(add_delete_tab)

    hw2_label = tk.Label(add_delete_tab, text="HW2:")
    hw2_entry = tk.Entry(add_delete_tab)

    hw3_label = tk.Label(add_delete_tab, text="HW3:")
    hw3_entry = tk.Entry(add_delete_tab)

    quiz1_label = tk.Label(add_delete_tab, text="Quiz 1:")
    quiz1_entry = tk.Entry(add_delete_tab)

    quiz2_label = tk.Label(add_delete_tab, text="Quiz 2:")
    quiz2_entry = tk.Entry(add_delete_tab)

    quiz3_label = tk.Label(add_delete_tab, text="Quiz 3:") 
    quiz3_entry = tk.Entry(add_delete_tab)

    quiz4_label = tk.Label(add_delete_tab, text="Quiz 4:")
    quiz4_entry = tk.Entry(add_delete_tab)

    midterm_label = tk.Label(add_delete_tab, text="MidtermExam:")
    midterm_entry = tk.Entry(add_delete_tab)

    final_label = tk.Label(add_delete_tab, text="FinalExam:")
    final_entry = tk.Entry(add_delete_tab)

    add_student_button = tk.Button(add_delete_tab, text="Add Student", command=add_student)

    # Place labels, input fields, and buttons in the Add Student Tab
    sid_label.grid(row=1, column=0, padx=5, pady=5, sticky=tk.W)
    sid_entry.grid(row=1, column=1, padx=5, pady=5)

    first_name_label.grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)
    first_name_entry.grid(row=2, column=1, padx=5, pady=5)

    last_name_label.grid(row=3, column=0, padx=5, pady=5, sticky=tk.W)
    last_name_entry.grid(row=3, column=1, padx=5, pady=5)

    email_label.grid(row=4, column=0, padx=5, pady=5, sticky=tk.W)
    email_entry.grid(row=4, column=1, padx=5, pady=5)

    hw1_label.grid(row=5, column=0, padx=5, pady=5, sticky=tk.W)
    hw1_entry.grid(row=5, column=1, padx=5, pady=5)

    hw2_label.grid(row=6, column=0, padx=5, pady=5, sticky=tk.W)
    hw2_entry.grid(row=6, column=1, padx=5, pady=5)

    hw3_label.grid(row=7, column=0, padx=5, pady=5, sticky=tk.W)
    hw3_entry.grid(row=7, column=1, padx=5, pady=5)

    quiz1_label.grid(row=8, column=0, padx=5, pady=5, sticky=tk.W)
    quiz1_entry.grid(row=8, column=1, padx=5, pady=5)

    quiz2_label.grid(row=9, column=0, padx=5, pady=5, sticky=tk.W)
    quiz2_entry.grid(row=9, column=1, padx=5, pady=5)

    quiz3_label.grid(row=10, column=0, padx=5, pady=5, sticky=tk.W)
    quiz3_entry.grid(row=10, column=1, padx=5, pady=5)

    quiz4_label.grid(row=11, column=0, padx=5, pady=5, sticky=tk.W)
    quiz4_entry.grid(row=11, column=1, padx=5, pady=5)

    midterm_label.grid(row=12, column=0, padx=5, pady=5, sticky=tk.W)
    midterm_entry.grid(row=12, column=1, padx=5, pady=5)

    final_label.grid(row=13, column=0, padx=5, pady=5, sticky=tk.W)
    final_entry.grid(row=13, column=1, padx=5, pady=5)

    add_student_button.grid(row=14, column=0, columnspan=2, padx=5, pady=10)

    # Define entry fields for homeworks
    hw1_label = tk.Label(add_delete_tab, text="Homework 1:")
    hw1_entry = tk.Entry(add_delete_tab)

    hw2_label = tk.Label(add_delete_tab, text="Homework 2:")
    hw2_entry = tk.Entry(add_delete_tab)

    hw3_label = tk.Label(add_delete_tab, text="Homework 3:")
    hw3_entry = tk.Entry(add_delete_tab)

    # Define entry fields for quizzes
    quiz1_label = tk.Label(add_delete_tab, text="Quiz 1:")
    quiz1_entry = tk.Entry(add_delete_tab)

    quiz2_label = tk.Label(add_delete_tab, text="Quiz 2:")
    quiz2_entry = tk.Entry(add_delete_tab)

    quiz3_label = tk.Label(add_delete_tab, text="Quiz 3:")
    quiz3_entry = tk.Entry(add_delete_tab)

    quiz4_label = tk.Label(add_delete_tab, text="Quiz 4:")
    quiz4_entry = tk.Entry(add_delete_tab)

    # Define entry fields for midterm and final exams
    midterm_label = tk.Label(add_delete_tab, text="Midterm Exam:")
    midterm_entry = tk.Entry(add_delete_tab)

    final_label = tk.Label(add_delete_tab, text="Final Exam:")
    final_entry = tk.Entry(add_delete_tab)

    # Delete Student Tab
    delete_sid_label = tk.Label(add_delete_tab, text="SID to Delete:")
    delete_sid_entry = tk.Entry(add_delete_tab)
    delete_student_button = tk.Button(add_delete_tab, text="Delete Student", command=delete_student)


    # Delete Student Tab
    delete_sid_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
    delete_sid_entry.grid(row=0, column=1, padx=10, pady=5)
    delete_student_button.grid(row=0, column=2, columnspan=2, padx=5, pady=10)

    # Import Data Tab
    import_data_button = tk.Button(import_tab, text="Import Data", command=import_data)
    import_data_button.pack(padx=20, pady=50)

    # Create a text box to display the imported data
    imported_text = tk.Text(import_tab, height=20, width=50)
    imported_text.pack(padx=20, pady=10)

    # Optionally, you can add a label to indicate the import status
    import_status_label = tk.Label(import_tab, text="")
    import_status_label.pack()

    # Search Student Tab
    search_sid_label = tk.Label(search_tab, text="SID to Search:")
    search_sid_entry = tk.Entry(search_tab)
    search_student_button = tk.Button(search_tab, text="Search Student", command=search_student)
    result_label = tk.Label(search_tab, text="")

    # Create a text box to display the searched student
    searched_student_text = tk.Text(search_tab, height=10, width=50)
    searched_student_text.grid(row=3, column=0, columnspan=2, padx=20, pady=10)

    # Place labels, input fields, and buttons in the Search Student Tab
    search_sid_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
    search_sid_entry.grid(row=0, column=1, padx=5, pady=5)
    search_student_button.grid(row=1, column=0, columnspan=2, padx=5, pady=10)
    result_label.grid(row=2, column=0, columnspan=2, padx=5, pady=10)

    # Update Scores Tab
    update_sid_label = tk.Label(update_tab, text="SID to Update:")
    update_sid_entry = tk.Entry(update_tab)

    update_hw1_label = tk.Label(update_tab, text="New HW1 Score:")
    update_hw1_entry = tk.Entry(update_tab)

    update_hw2_label = tk.Label(update_tab, text="New HW2 Score:")
    update_hw2_entry = tk.Entry(update_tab)

    update_hw3_label = tk.Label(update_tab, text="New HW3 Score:")
    update_hw3_entry = tk.Entry(update_tab)

    update_quiz1_label = tk.Label(update_tab, text="New Quiz 1 Score:")
    update_quiz1_entry = tk.Entry(update_tab)

    update_quiz2_label = tk.Label(update_tab, text="New Quiz 2 Score:")
    update_quiz2_entry = tk.Entry(update_tab)

    update_quiz3_label = tk.Label(update_tab, text="New Quiz 3 Score:")
    update_quiz3_entry = tk.Entry(update_tab)

    update_quiz4_label = tk.Label(update_tab, text="New Quiz 4 Score:")
    update_quiz4_entry = tk.Entry(update_tab)

    update_midterm_label = tk.Label(update_tab, text="New Midterm Score:")
    update_midterm_entry = tk.Entry(update_tab)

    update_final_label = tk.Label(update_tab, text="New Final Score:")
    update_final_entry = tk.Entry(update_tab)

    update_scores_button = tk.Button(update_tab, text="Update Scores", command=update_scores)

    # Place labels, input fields, and buttons in the Update Scores Tab
    update_sid_label.grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
    update_sid_entry.grid(row=0, column=1, padx=5, pady=5)

    update_hw1_label.grid(row=1, column=0, padx=5, pady=5, sticky=tk.W)
    update_hw1_entry.grid(row=1, column=1, padx=5, pady=5)

    update_hw2_label.grid(row=2, column=0, padx=5, pady=5, sticky=tk.W)
    update_hw2_entry.grid(row=2, column=1, padx=5, pady=5)

    update_hw3_label.grid(row=3, column=0, padx=5, pady=5, sticky=tk.W)
    update_hw3_entry.grid(row=3, column=1, padx=5, pady=5)


    update_quiz1_label.grid(row=4, column=0, padx=5, pady=5, sticky=tk.W)
    update_quiz1_entry.grid(row=4, column=1, padx=5, pady=5)

    update_quiz2_label.grid(row=5, column=0, padx=5, pady=5, sticky=tk.W)
    update_quiz2_entry.grid(row=5, column=1, padx=5, pady=5)

    update_quiz3_label.grid(row=6, column=0, padx=5, pady=5, sticky=tk.W)
    update_quiz3_entry.grid(row=6, column=1, padx=5, pady=5)

    update_quiz4_label.grid(row=7, column=0, padx=5, pady=5, sticky=tk.W)
    update_quiz4_entry.grid(row=7, column=1, padx=5, pady=5)

    update_midterm_label.grid(row=8, column=0, padx=5, pady=5, sticky=tk.W)
    update_midterm_entry.grid(row=8, column=1, padx=5, pady=5)

    update_final_label.grid(row=9, column=0, padx=5, pady=5, sticky=tk.W)
    update_final_entry.grid(row=9, column=1, padx=5, pady=5)

    update_scores_button.grid(row=10, column=0, columnspan=2, padx=5, pady=10)

    # Export Data Tab
    export_button = tk.Button(export_tab, text="Export Data", command=export_data)

    # Place the export button in the Export Data Tab
    export_button.pack(padx=20, pady=20)

    # Create the main window
    root.mainloop()
python pandas database csv append
1个回答
0
投票

您似乎正在使用 Python 和 Tkinter 开发成绩簿系统。您的代码提供导入、添加、删除、搜索、更新以及可能导出学生数据的功能。但是,您提到您遇到了问题,因为并非所有数据都附加到 CSV 文件中。让我们先解决这个问题。

为了确保所有数据都正确附加到 CSV 文件,您应该对 add_student_data 和 save_data_to_csv 函数进行一些更改。具体来说,您应该更新字段名称列表中的列名称,以匹配您在学生词典中使用的键。以下是这些函数的修改后的代码:

def add_student_data(sid, first_name, last_name, email, hw1, hw2, hw3, quiz1, quiz2, quiz3, quiz4, midterm, final):
    global student_data

    # Create a new student record
    new_student = {
        'SID': sid,
        'FirstName': first_name,
        'LastName': last_name,
        'Email': email,
        'HW1': hw1,
        'HW2': hw2,
        'HW3': hw3,
        'Quiz1': quiz1,
        'Quiz2': quiz2,
        'Quiz3': quiz3,
        'Quiz4': quiz4,
        'MidtermExam': midterm,
        'FinalExam': final
    }

    # Add the new student to the data list
    student_data.append(new_student)

    # Save the updated data to the CSV file
    save_data_to_csv()

def save_data_to_csv():
    global student_data

    # Specify the CSV file path
    csv_file_path = 'Student_data.csv'

    # Write the data to the CSV file in append mode
    with open(csv_file_path, mode='a', newline='') as csvfile:
        fieldnames = ['SID', 'FirstName', 'LastName', 'Email', 'HW1', 'HW2', 'HW3',
                      'Quiz1', 'Quiz2', 'Quiz3', 'Quiz4', 'MidtermExam', 'FinalExam']

        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

        # If the file is empty, write the header row
        if csvfile.tell() == 0:
            writer.writeheader()

        # Write the data for the new student to the CSV file
        for student in student_data:
            writer.writerow(student)

这些更改应确保所有学生数据都正确附加到 CSV 文件中。

© www.soinside.com 2019 - 2024. All rights reserved.