我正在尝试为我一直在研究的聊天程序创建和使用数据库。我的聊天程序使用configparser和线程来加载多个客户端。我无法尝试从列表中删除一个名称,它在我尝试时从列表中删除所有名称。还有一个程序说我有名字" P $ Y | Omen"在列表中,该程序不会让我只添加" P $ Y"或者"预兆"到列表。有没有办法确保它只检查一行上的唯一名称?
数据库文件只是一个文本文档,每个人名都在一行上。
def remUser(self, sMsg):
f = open('db.txt', 'r')
lines = f.readlines()
f.close()
f = open('db.txt', 'w')
for line in lines:
if line != sMsg:
f.write(line)
self.send(sMsg + ' has been removed from the database.')
return
def addUser(self, sMsg):
def check(sMsg):
with open('db.txt') as dataf:
return any(sMsg in line for line in dataf)
def write(sMsg):
with open('db.txt', 'a') as database:
database.write(sMsg + '\n')
if check(sMsg):
return
else:
write(sMsg)
self.send(sMsg + " has been added to the database.")
return
def hasAccess(self, sUsername):
db = open('db.txt', 'r')
for line in db:
for name in line.split():
if name == sUsername:
return name
else:
pass
答案 0 :(得分:0)
你选择非常低效:
存储数据的类型和方法
执行此操作的算法。
我在小学写了自己的聊天,并使用pickle模块来保存用户和消息的信息。
from cPickle import load, dump
def addUser (name):
f = open("users.pdc", "rb")
users = load(f)
f.close()
if name in users:
raise KeyError, "User %s already exists!" % name
users.append(name)
f = open("users.pdc", "wb")
dump(users, f)
f.close()
def remUser (name):
f = open("users.pdc", "rb")
users = load(f)
f.close()
try: users.remove(name)
except: raise KeyError, "User %s does not exist!" % name
f = open("users.pdc", "wb")
dump(users, f)
f.close()
def createfile ():
f = open("users.pdc", "wb")
dump([], f)
f.close()
等。等
这很方便,因为您几乎可以序列化任何Python对象,这意味着您可以根据需要输入尽可能多的结构化数据。
如果你想保持自己的方式,那就没关系了,但是通过for循环过滤,最明确的是,逐行写入文件并不是一种方法。
会很慢。列表已经有你需要的方法,因此在readlines()之后你可以使用list.remove()。
另外,要写回所有文件,请使用file.writelines()或file.write(str.join(list))。
但是,使用一个文件数据库的最佳方法是使用sqlite3。它包含在Python标准库中。
关于它的最好的事情是,如果你需要,你将能够切换到一些严肃的DBMS。
通过这种方式,您的聊天效率很高,不会通过反复写操作来扼杀操作系统并破坏您的记忆。