Python 如何在脚本运行之前附加到csv文件?

Python 如何在脚本运行之前附加到csv文件?,python,csv,Python,Csv,我目前正在制作一个登录系统,它将用户名和密码存储在一个文本文件中 这是我的代码: import csv Brugere = open("D:\Filer\Programmering/Profiles.txt","r+",newline="\n") writer = csv.writer(Brugere, delimiter=",") print("Welcome to the chat app!&quo

我目前正在制作一个登录系统,它将用户名和密码存储在一个文本文件中

这是我的代码:

import csv

Brugere = open("D:\Filer\Programmering/Profiles.txt","r+",newline="\n")
writer = csv.writer(Brugere, delimiter=",")

print("Welcome to the chat app!")

Brugernavn = "" //means username
Kodeord = ""   // means password


def Signup(j,k):
    print("Welcome to sign up!\n Please enter your Username")
    j = input("")
    if j not in Brugere:
        print("Hello, " + j + ", please enter a password:")
        k = input("")
        line1 = [j,k]
        writer.writerow(line1)
        print("Great! Now you can sign in")
        Signin(Brugernavn, Kodeord)
    else:
        print("Username already taken! try again")
        Signup(Brugernavn, Kodeord)

def Signin(U,P):
    print("Welcome to sign in!")
    print("Do you already have an account?[y/n]")
    ans = input("")
    if ans == "n":
        print("You will now be redirected to sign up")
        Signup(Brugernavn, Kodeord)
    elif ans == "y":
        U = input("Username: ")
        if U in Brugere:
            P = input("Password: ")
            print("WELCOME")
        else:
            print("Invalid username, try again")
            Signin(Brugernavn, Kodeord)
    else:
        print("Please write 'y' or 'n'")
        Signin(Brugernavn, Kodeord)


Signin(Brugernavn, Kodeord)
Brugere.close()
当我运行它时,
signup
函数正常工作,但是当调用signin函数时,它无法从文本文件中找到用户名和密码。我认为这是因为它们只有在脚本运行完成后才会被追加。然而,我不确定

我已经为这个csv文件的事情挣扎了很长时间。我想要像这样的 其中每一行都是一个列表,我可以在其中找到用户名和密码


我听说有人叫它“逗号分隔值”,但我不知道怎么做。

创建CSV非常简单,只需编写一个字符串,每个值由一个指定字符分隔,通常如名称所示为逗号。您并不需要csv库来实现这一点

您的注册方法如下所示:

def Signup(j,k):
    print("Welcome to sign up!\n Please enter your Username")
    j = input("")
    if j not in Brugere:
        print("Hello, " + j + ", please enter a password:")
        k = input("")
        line1 = [j,k]
        # Write a string with a comma between the values   
        Brugere.write("{}, {}\n".format(j, k))
        print("Great! Now you can sign in")
        Signin(Brugernavn, Kodeord)
    else:
        print("Username already taken! try again")
        Signup(Brugernavn, Kodeord)
话虽如此,使用CSV在应用程序中存储操作数据对我来说没有多大意义。请参阅下面使用SQLite的
注册
的修改版本,该版本更加健壮,使用起来仍然简单:

import sqlite3
con = sqlite3.connect('brugere.db')
cur = con.cursor()

# Create a user table with bruger and kodeord
# I added an extra field for when the user was created as well 
# which defaults to the date and time the user was created 
cur.execute("""create table if not exists brugere
               (brugernavn text, 
                kodeord text,
                dato_oprettet TIMESTAMP  DEFAULT CURRENT_TIMESTAMP)""")

con.close()


def signup():
    
    con = sqlite3.connect('brugere.db')
    cur = con.cursor()
    
    with con:
        print("Please enter your Username")
        bruger = input()
        cur.execute("select brugernavn from brugere where brugernavn =?", [bruger])
        
        bruger_eksisterer = cur.fetchone()
        
        if bruger_eksisterer:
            print("Username already taken! Try again")
            # Signup(Brugernavn, Kodeord)
        else:    
            print("Hello, " + bruger + ", please enter a password:")
            kodeord = input()
            
            try:
                cur.execute("insert into brugere (brugernavn, kodeord) values (?, ?)", (bruger, kodeord))
                print("Great! Now you can sign in")
            except sqlite3.Error as Err:
                print("Couldn't add user.\nError: {}".format(Err))         
                # Signin(Brugernavn, Kodeord)        
    
    con.close()

signup()    

修改
登录
应该是严格的,但这部分由您决定。

TL;博士: 我认为最简单的解决办法是:

...
    if j not in brugere:
        ...
        writer.writerow(line1)
        brugere.flush()  # Flush pending changes to file.
        ...
...
然而,我注意到一些值得考虑的事情:

  • Python帮助。您可以在交互式Python会话中获得有关Python内容的帮助:
  • CSV对于这种用例来说不是一个好主意。如果是生产级的,请使用合适的数据库;如果只是在本地玩Python,请使用
    dict()
    并存储为JSON。即:
  • 请注意,
    open()
    返回类
    io.TextIOWrapper
    中包装的
    流(请参阅
    python-c“导入io;帮助(io.TextIOWrapper)”
    )。它基本上是一个获取所需数据的接口,而不是数据本身。例如,尝试
    open(“test.txt”).readlines()
    从流中实际读取数据。请注意,流是耗材

  • 在流
    Brugere
    上调用
    in
    时,您调用的是类
    io.TextIOWrapper
    上的
    \uuuuu contains\uuu()
    dunder方法,该方法未实现。但是Python作为Python返回
    False
    (这没有意义)

  • CSV接口非常简单:


您正在以读取模式打开文件,但正在尝试写入。在模式中使用
“a”
(这意味着“追加”并打开它进行写入,如果存在,则追加到文件的末尾)。请参阅函数的文档。使用
csv
模块将在传递给
writerow()
的列表中的值之间自动添加逗号。非常感谢!听起来很有帮助……不客气。顺便说一句,我还建议你阅读并开始遵循以下特别是关于-这将使你的代码更可读,特别是对其他人。密码不应该被记录!!!!在所有不安全的事情中,这是最糟糕的。另外,密码应该用salt+hash保存,并且没有办法恢复原始密码。非常感谢:D这真的很有帮助!嗯,还有一件事。你知道我如何检查密码是否与用户名匹配吗?因此,如果它与用户名在同一行。我猜那一行的用户名是[0],密码应该是[1]。但是我该怎么做呢?我也可以去试试SQLite。但现在我真的想让它工作:)python有一个cvs模块。如果我的密码是“,”,“,\n”,那么像您这样编写cvs将失败。这里的关键是您打算使用
列表来执行映射作业。列表的键查找惩罚为
O(n)
,对于映射,则为
O(1)
。进一步的地图设计用于
地图
数据。也就是说,存储和检索属于某些
键的数据
。它还带有自动防复制功能(在CSV解决方案中这会非常昂贵)。您确实想使用地图(某种形式)。
python

> import csv
> help(csv)
import json

username = "myuser"
password = "password"
filename = "data.json"

# Reads data. Requires file `data.json` to exist, with content `{}`.
with open(filename, "r") as data_stream:
    data = json.load(data_stream)

if username in data:
    print(f"User {username} exists.")
else:
    data[username] = password  # You'd usually hash and salt a password. It's a separate topic.

# Writes data to disk.
with open(filename, "w") as data_stream:
    data_stream.write(json.dumps(data, indent=2))  # Makes it look pretty on disk.
import csv

filename = "test.txt"

f = open(filename, "w")
writer = csv.writer(f)
writer.write(["myuser", "password"])

# Flushes lines to file.
f.flush()
...

f.close()