CSV重写器不断创建新标题

2024-04-30 01:47:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码每次都创建相同的头,我希望它创建一个,并将数据附加到CSV而不创建新的头。你知道吗

What it looks like in the CSV

What I want it to look like

import csv

with open("Details.csv","a+") as Details:
    w=csv.writer(Details,delimiter=",")

    headers1=["Name","Age","Year Group"]
    line=Details.readlines()
    if line!=["Name","Age","Year Group"]:
        w.writerow(headers1)
    print("Welcome User, to my Topics Quiz!\n-------------------------------
    --------\nYou can choose from 3 different topics:\n  • History\n  •
    Music\n •  Computer Science\n---------------------------------------")
    print("Before we start, we need to register an account.")
    User=input("Enter your name:\n")
    Age=input("Enter your age:\n")
    Year=input("Enter your year group:\n")

    details=[User,Age,Year]
    w.writerow(details)
    Details.close()

with open("UserPass.csv","a+") as Userpass:
    w=csv.writer(Userpass,delimiter=",")
    headers2=["Username","Password"]
    if headers2 not in Userpass:
       w.writerow(headers2)

NewUser=(User[:3]+Age)
print("Great! Your username is set to: {}".format(NewUser))
Pass=input("Enter a password for your account:\n")
userpass=[NewUser,Pass]
w.writerow(userpass)
Userpass.close()

非常感谢您的帮助。你知道吗


Tags: csvtoinputageyourdetailsyearprint
3条回答

我不理解您的代码试图完成的所有任务,但是下面将向Details.csv添加一行,而不创建任何新的头:

import csv
import os

csv_fileheader = "Name", "Age", "Year Group"
csv_filename = "Details.csv"

print("Welcome User, to my Topics Quiz!\n"
      "                   -\n"
      "You can choose from 3 different topics:\n"
      " • History\n • Music\n • Computer Science\n"
      "                   -")
print("Before we start, we need to register an account.")
user = input("Enter your name:\n")
age = input("Enter your age:\n")
year = input("Enter your year group:\n")

if not os.path.isfile(csv_filename):  # Create file if it doesn't exist.
    with open(csv_filename, "w", newline='') as csv_file:
        csv.writer(csv_file).writerow(csv_fileheader)  # Put header row in it.

with open(csv_filename, "a+", newline='') as details2:
    writer = csv.writer(details2, delimiter=",")
    writer.writerow((user, age, year))

您应该考虑遵循PEP 8 - Style Guide for Python Code的建议,因为这将使您的代码更易于您和其他人阅读。你知道吗

您正在以追加模式(https://docs.python.org/3/library/functions.html#open)打开文件,因此line=Details.readlines()将始终是空行,并且每次都会写入头文件(如果,代码将始终进入)。你知道吗

与其他文件类似。所以我建议您首先检查文件是否存在,如果不存在,请创建文件并添加头文件,并从with中删除头文件部分:

import csv

import os.path
if not os.path.isfile("Details.csv"):
    with open("Details.csv", "a+") as Details:
        w = csv.writer(Details, delimiter=",")
        headers1 = ["Name", "Age", "Year Group"]
        w.writerow(headers1)
        Details.close()

if not os.path.isfile("UserPass.csv"):
    with open("UserPass.csv", "a+") as Userpass:
        w = csv.writer(Userpass, delimiter=",")
        headers2 = ["Username", "Password"]
        w.writerow(headers2)
        Userpass.close()

with open("Details.csv", "a+") as Details:
    w = csv.writer(Details, delimiter=",")
    print("Welcome User, to my Topics Quiz!\n               -"
          "    \nYou can choose from 3 different topics:\n  • History\n  • "
          "Music\n •  Computer Science\n                   -")
    print("Before we start, we need to register an account.")
    User = input("Enter your name:\n")
    Age = input("Enter your age:\n")
    Year = input("Enter your year group:\n")

    details = [User, Age, Year]
    w.writerow(details)
    Details.close()

with open("UserPass.csv", "a+") as Userpass:
    w = csv.writer(Userpass, delimiter=",")
    NewUser = (User[:3] + Age)
    print("Great! Your username is set to: {}".format(NewUser))
    Pass = input("Enter a password for your account:\n")
    userpass = [NewUser, Pass]
    w.writerow(userpass)
    Userpass.close()

代码中存在不同的问题:

1)csv文件中有数据的行之间的空行,这是由于打开的非二进制类型造成的,可以通过在打开函数中添加arg来修复:

w=csv.writer(Details,delimiter=",",lineterminator='\n')

2)在你的情况下详细信息.readlines()方法返回[],因为a+类型的打开,它应该在文件末尾添加行,所以指针已经在末尾,我们需要使用该代码在开头返回它:

line=Details.seek(0)

3)而且,我们只需要第一行,所以只需要使用readline()方法。毕竟,您的条件应该是这样的,因为返回类型和事实是在每一行的末尾都有:

if line!="Name,Age,Year Group\n":

以及那部分的完整代码。让我知道它是否适合您:

w=csv.writer(Details,delimiter=",",lineterminator='\n')
headers1=["Name","Age","Year Group"]
line=Details.seek(0)
line=Details.readlines()[0]
print(line)
if line!="Name,Age,Year Group\n":
    w.writerow(headers1)

相关问题 更多 >