如果CSV文件已经存在,如何填写数据?

odopli94  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(103)

我试图写一个代码,将允许用户输入一个代码,一旦代码已被输入,代码将搜索用户的csv文件,如果用户匹配的csv文件上的现有条目,然后它寻找下一个可用的列中的用户行,并在那里输入数字。如果没有开放的插槽,那么它将覆盖第一个插槽。

正如你在上面看到的,如果用户silverspoon输入一个代码8,那么它应该更新CODE3列,因为它是空的。如果goldspoon输入一个代码17,那么它应该更新CODE1列,因为所有列都有数据。如果bronzespoon输入一个代码99,那么它应该创建一个新的数据行,因为它们不在列表中。它应该看起来像下面这样。

这是一个代码,我目前有,但不幸的是,我让用户输入所有的代码都一遍,它会更新整行每次新的代码输入。

now = datetime.now()
    entrydate = now.strftime("%m/%d/%Y")
    fields = ["USER", "DATE", "CODE1", "CODE2", "CODE3", "CODE4", "CODE5"]
    df = pd.read_csv("C:\test\codes.csv")
    if username in df.values: # I use this to determine if the user is already on the CSV file
        with open("C:\test\codes.csv", "r") as csvfile, tempfile:
            reader = csv.DictReader(csvfile, fieldnames=fields)
            writer = csv.DictWriter(tempfile, lineterminator='\n', fieldnames=fields)
            for row in reader:
                if row["USER"] == username:
                    new_codes = [entrydate,code1, code2, code3, code4, code5]
                    row["DATE"], row["CODE1"], row["CODE2"], row["CODE3"], row["CODE4"], row["CODE5"] = new_codes
                row = {
                    "USER": row["USER"],
                    "DATE": row["DATE"],
                    "KEYWORD1": row["CODE1"],
                    "KEYWORD2": row["CODE2"],
                    "KEYWORD1": row["CODE3"],
                    "KEYWORD2": row["CODE4"],
                    "KEYWORD3": row["CODE5"],
                }
                writer.writerow(row)
        shutil.move(tempfile.name, "C:\test\codes.csv")
        print(f"{username} updated their code list of {code1} , {code2} , {code3} , {code4} , & {code5} effective {entrydate}")
        return
    else:
        with open("C:\test\codes.csv","a", newline="") as f:
            writer = csv.writer(f)
            writer.writerow([username,entrydate,code1,code2,code3,code4,code5])
            print(f"{username} added {code1} ,{code2} ,{code3} , {code4} , & {code5} to to their code list effective {entrydate}")
            return
dluptydi

dluptydi1#

你的代码中有一些错误,我根据你想要的规则修改了它(当用户存在且没有空槽时,当没有空槽且用户不存在时)不要忘记用用户输入替换usernamenew_code

import csv
import pandas as pd
import shutil
import os
from datetime import datetime

now = datetime.now()
entrydate = now.strftime("%m/%d/%Y")
fields = ["USER", "DATE", "CODE1", "CODE2", "CODE3", "CODE4", "CODE5"]
filename = "C:\\test\\codes.csv"
temp_filename = "C:\\test\\temp_codes.csv"

username = "silverspoon"
new_code = 8

df = pd.read_csv(filename)

if username in df.values:
    with open(filename, "r") as csvfile, open(temp_filename, "w", newline="") as tempfile:
        reader = csv.DictReader(csvfile, fieldnames=fields)
        writer = csv.DictWriter(tempfile, lineterminator='\n', fieldnames=fields)
        writer.writeheader()

        for row in reader:
            if row["USER"] == username:
                for i in range(1, 6):
                    code_key = f"CODE{i}"
                    if not row[code_key]:
                        row[code_key] = new_code
                        break
                else:
                    row["CODE1"] = new_code
                row["DATE"] = entrydate
            writer.writerow(row)

    shutil.move(temp_filename, filename)
    print(f"{username} updated their code list with {new_code} effective {entrydate}")

else:
    with open(filename, "a", newline="") as f:
        writer = csv.writer(f)
        writer.writerow([username, entrydate, new_code, "", "", "", ""])
        print(f"{username} added {new_code} to their code list effective {entrydate}")

相关问题