2013-05-28 4 views
2

파이썬 2.4를 사용 중이며 unix 마지막 명령의 값을 CSV 파일로 내보내려고합니다. 어떻게 CSV 파일에 실제로 각 라인을 작성 얻을 수 알아낼 수 없다, 어떤 도움을 주시면 감사하겠습니다!dictreader를 CSV 파일로 작성하는 파이썬

import csv 

def check(user,logfile,name): 
    logfile.write('********' + name + '*********\n') 
    g = subprocess.Popen(["last",user], stdout=subprocess.PIPE) 
    stdout, stderr = g.communicate() 
    reader = csv.DictReader(stdout.splitlines(), 
          delimiter=' ', skipinitialspace=True, 
          fieldnames=['id', 'pts', 'cpu', 
             'day', 'month', 'date', 
             'time', 'dash', 'off', 
             'loggedin', 'test1', 'test2']) 

    writer = csv.writer(open('dict.csv','wb')) 
    for row in reader: 
     writer.writerow(row) 

답변

4

당신은 (일치 fieldName에로) 대신 csv.DictWriter()를 사용하거나 시퀀스로 사전 행을 설정하는 중 필요

writer.row([value for key, value in sorted(row.items())]) 

것 출력 예를 들어 자신의 키에 의해 정렬 된 값.

DictWriter를 사용하는 것처럼 간단 할 수있다 : 당신의 DictReader() 클래스가 기대하는 내용과, 같은 순서로, 동일한 필드를 쓸 것이다

writer = csv.DictWriter(open('dict.csv','wb'), fieldnames=reader.fieldnames) 

.

+0

헤더를 명시 적으로 다음과 같이 작성해야합니다. writer.writeheader() 그렇지 않으면 헤더가 쓰여지지 않습니다. – Bolaka

+0

@Bolaka : 예, 모든 유스 케이스에는 헤더 행이 필요하지는 않습니다. OP는 여기에'DictReader'에 대한 명시적인'fieldnames' 인자를 사용했습니다. 이것은 입력 파일에 헤더 행이 없음을 의미합니다. –

+0

사실, 모든 유스 케이스에는 헤더 행이 필요하지 않습니다. Writer = csv.DictWriter (open ('dict.csv', 'wb'), fieldnames = reader.fieldnames)는 헤더를 쓸 것이라는 인상을주었습니다. 그래서 나는 누군가가 헤더를 쓰고 싶다면 add - writer.writeheader()라고 대답해야한다고 생각한다. – Bolaka