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,请使用
并存储为JSON。即:dict()
- 请注意,
返回类open()
中包装的io.TextIOWrapper
流(请参阅
)。它基本上是一个获取所需数据的接口,而不是数据本身。例如,尝试python-c“导入io;帮助(io.TextIOWrapper)”
从流中实际读取数据。请注意,流是耗材open(“test.txt”).readlines()
- 在流
上调用Brugere
时,您调用的是类in
上的io.TextIOWrapper
dunder方法,该方法未实现。但是Python作为Python返回\uuuuu contains\uuu()
(这没有意义)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()