【问题标题】:CSV rewriter keeps creating new headersCSV 重写器不断创建新标头
【发布时间】:2017-10-25 21:59:00
【问题描述】:

我的代码每次都创建相同的标题,我希望它创建一个并将数据附加到 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()

非常感谢任何帮助。

【问题讨论】:

标签: python python-3.x file csv


【解决方案1】:

您正在以附加模式 (https://docs.python.org/3/library/functions.html#open) 打开文件,因此此 line=Details.readlines() 将始终为空行,并且您的标题每次都会被写入(代码将始终进入 if)。

与其他文件类似。所以我建议你首先检查文件是否存在,如果不存在,则创建并添加标题,并从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()

【讨论】:

  • 出色的工作!我可以看到你已经付出了很大的努力来提供帮助。虽然只是一个小问题,但我的强迫症在这种情况下有点过分。在文本文件中,每个用户与其他内容之间存在差距,可能是由于我在每个输入行 \n 造成的吗?
【解决方案2】:

您的代码中存在不同的问题:

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

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

2) 在您的情况下,Details.readlines() 方法返回 [],由于 a+ 类型的打开,它应该在文件末尾添加行,所以指针已经在末尾,我们需要返回在开始时使用该代码:

line=Details.seek(0)

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

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)

【讨论】:

    【解决方案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 的建议,因为这将使您和其他人都更容易阅读您的代码。

    【讨论】:

    • 谢谢,我已经阅读了 PEP 8 也使用了 youtube,我发现它非常有用,从你的角度来看,我看到我糟糕的代码读起来有多难,关于你的代码,我运行它但是现在没有出现标题。创建 csv 时我只想要一个。
    • 当我在一个已经有一个标题和几行数据的现有文件上测试它时,代码只是在文件末尾添加了一个新行。如果该文件尚不存在,则将创建一个文件并且它没有标题,所以可能就是这样。
    • SRD1707:抱歉,我不明白您的后续问题。您在谈论哪个代码,您的代码还是我的答案?每个输入 ine 中的 \n 是什么?哪个文本文件?这些差距什么时候出现?
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多