2010-06-06 2 views
4

저는 csv.DictWriter를 사용하여 사전 집합에서 csv 파일을 출력하고 있습니다. 나는 다음과 같은 기능을 사용 dictrows는 사전의 목록입니다Python에서 csv.writer의 형식 지정

def dictlist2file(dictrows, filename, fieldnames, delimiter='\t', 
      lineterminator='\n'): 
    out_f = open(filename, 'w') 

    # Write out header 
    header = delimiter.join(fieldnames) + lineterminator 
    out_f.write(header) 

    # Write out dictionary 
    data = csv.DictWriter(out_f, fieldnames, 
       delimiter=delimiter, 
       lineterminator=lineterminator) 
    data.writerows(dictrows) 
    out_f.close() 

을하고 fieldName에이 파일에 직렬화해야 헤더를 제공합니다.

내 사전 목록 (dictrows)의 값 중 일부는 숫자입니다. 떠돌아 다닙니다. 그리고 이것들의 서식을 지정하고 싶습니다. 예를 들어, float를 전체 정밀도가 아닌 "% .2f"로 serialize하는 것이 좋습니다. 이상적으로는 각 유형의 형식을 지정하는 방법을 지정하는 매핑을 지정하고 싶습니다.

{float: "%.2f"} 

플로트가 있으면 % .2f로 포맷합니다. 이 작업을 수행하는 쉬운 방법이 있습니까? 나는 DictWriter 나 그와 같은 복잡한 것을 서브 클래스하고 싶지 않다 - 이것은 매우 일반적인 기능처럼 보인다.

어떻게이 작업을 수행 할 수 있습니까?

내가 생각할 수있는 유일한 해결책은 DictWriter의 포맷팅을 망쳐 놓는 대신 부동 소수점의 십진수 정밀도를 % .2로 지정하여 십진법 패키지를 직렬화하는 것입니다. 이것이 더 나은 해결책인지 모른다.

감사합니다.

답변

5
class TypedWriter: 
    """ 
    A CSV writer which will write rows to CSV file "f", 
    which uses "fieldformats" to format fields. 
    """ 

    def __init__(self, f, fieldnames, fieldformats, **kwds): 
     self.writer = csv.DictWriter(f, fieldnames, **kwds) 
     self.formats = fieldformats 

    def writerow(self, row): 
     self.writer.writerow(dict((k, self.formats[k] % v) 
            for k, v in row.iteritems())) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 

테스트되지 않았습니다.

관련 문제