Python DictWriter没有在多客户端应用程序中编写某些行

时间:2015-01-13 06:09:59

标签: python csv

我正在开发一个客户端 - 服务器python程序,目前我正在运行它,有两个客户端向服务器发送数据。当我运行它时,我启动一个客户端,然后几秒钟后启动另一个客户端。

问题是当我在客户端完成后查看数据库时,我只看到为第二个客户端(最后一个启动的那个)写入的条目,即使程序输出(stdout)显示它已经过去了为来自两个客户端的数据写入csv的代码部分。两个客户端以10秒的间隔发送信息。下面是服务器接收消息的代码。在strs [0] ==' \' cpu':

的情况下,它会写入相关的csv文件
def serverLoop(conn):
with open(database, 'wb') as csvfile:
    fieldnames = ['cpu', 'pid', 'memory']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames, 
        quotechar='|', quoting=csv.QUOTE_MINIMAL)
    writer.writeheader()
    while 1:
        data = conn.recv(1024)
        #print 'data is', repr(data)
        #if repr(data) == COMPLETE: break
        conn.send(data)

        strs = repr(data).split()
        if strs[0] == '\'Thread':
            t = strs[9]
            process = strs[4] 
            logging.info('Heartbeat from thread with pid %s running at %s seconds' % (process, t))

        if strs[0] == '\'cpu':
            cpuData = strs[1] + ', ' + strs[2]
            print 'cpu data received'
            writer.writerow({'cpu': cpuData})
            print cpuData
            print 'wrote to db'

我在ubuntu上使用python 2.7。

2 个答案:

答案 0 :(得分:0)

csv文件不是数据库。如果您同时从两个不同的程序写入文件,则只有最后一次保存才会赢得' (覆盖另一个)。

答案 1 :(得分:0)

问题可能是您打开文件的方式。使用模式"wb"将在每次打开文件时截断文件,丢弃之前的任何内容。如果您的每个客户端都连接到服务器一次,这可能就是您只看到第二个客户端的原因。

尝试使用模式"ab"代替"wb""a"代表"追加"模式,允许写入并自动搜索到文件的末尾。

这样做的一个缺点是,如果你使用当前的代码,你会得到重复的标题,因为你每次设置DictReader时都要写它们。您可能希望进行一些额外的检查,以查看该文件是否已有某些内容,如果没有,则只写入标题。一种简单的方法是拨打csvfile.tell(),报告您在文件中的位置。由于追加模式寻找到文件的末尾,因此只有当文件为空(或者之前没有)时它才会为零。