2015-01-13 1 views
0

현재 클라이언트 - 서버 Python 프로그램이 있는데, 현재 서버에 데이터를 보내는 두 개의 클라이언트로 실행 중입니다. 나는 그것을 실행할 때 한 클라이언트를 시작한 다음 몇 초 후에 다른 클라이언트를 시작합니다.Python DictWriter가 다중 클라이언트 응용 프로그램에서 특정 행을 작성하지 않습니다.

문제는 클라이언트가 완료된 후 데이터베이스를 보면 프로그램 출력 (stdout)이이를 보여 주지만 두 번째 클라이언트 (마지막으로 시작한 클라이언트)에 대한 항목 만 볼 수 있다는 것입니다. 두 클라이언트 모두에서 오는 데이터에 대해 CSV에 쓰는 코드 섹션을 지나쳐야합니다. 두 클라이언트는 모두 10 초 간격으로 정보를 보냅니다. 다음은 서버에 메시지를 걸리는 코드는이 사건에서 문제의 csv 파일에 기록하는 위치 strs [0] == '\'CPU '.

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' 

내가 파이썬 2.7를 사용하고 있습니다 우분투.

답변

0

csv 파일은 데이터베이스가 아닙니다. 동시에 두 개의 다른 프로그램에서 파일에 쓰면 마지막 저장 만 '이기기'(다른 하나를 덮어 쓰기)합니다.

+0

죄송합니다. 위의 기능 만 CSV에 쓰고 있고 두 개의 다른 클라이언트의 데이터를 수신하고 있습니다. –

+0

사실, 나는 당신의 요지를 보았습니다, 응답에 감사드립니다. –

0

문제는 아마도 파일을 여는 방법 일 것입니다. 모드 "wb"을 사용하면 파일을 열 때마다 파일이 잘려서 이전 내용이 버려집니다. 각 클라이언트가 서버에 한 번 연결하면 이것이 아마도 두 번째 클라이언트 만 보는 이유 일 것입니다.

"wb" 대신 "ab" 모드를 사용해보십시오. "a"은 쓰기를 허용하고 파일의 끝까지 자동으로 탐색하는 "추가"모드의 약자입니다.

단점은 현재 코드를 사용하는 경우 DictReader을 설정할 때마다 작성하기 때문에 중복 헤더가 생성된다는 것입니다. 파일에 이미 내용이 있는지 확인하기 위해 몇 가지 추가 검사를 수행하고 헤더가없는 경우에만 헤더를 쓸 수 있습니다. 이를 수행하는 쉬운 방법은 csvfile.tell()으로 전화하여 파일에서 자신의 위치를보고하는 것입니다. 추가 모드는 파일의 끝에 도달하므로 파일이 비어 있거나 이전에는 존재하지 않았을 경우에만 0이됩니다.

+0

네, 무슨 뜻인지 알 겠어요! –

관련 문제