试图读/写有问题的文本文件

时间:2015-11-30 21:49:39

标签: python file config

我正在尝试为我一直在研究的聊天程序创建和使用数据库。我的聊天程序使用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

1 个答案:

答案 0 :(得分:0)

你选择非常低效:

  1. 存储数据的类型和方法

  2. 执行此操作的算法。

  3. 我在小学写了自己的聊天,并使用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。

    通过这种方式,您的聊天效率很高,不会通过反复写操作来扼杀操作系统并破坏您的记忆。