csv로 헤더 행 쓰는 법딕트 라이터?
내가 가지고 있다고 가정해봐요.csv.DictReader
object와 CSV 파일로 작성하고 싶습니다.이거 어떻게 해요?
다음과 같이 데이터 행을 작성할 수 있다는 것을 알고 있습니다.
dr = csv.DictReader(open(f), delimiter='\t')
# process my dr object
# ...
# write out object
output = csv.DictWriter(open(f2, 'w'), delimiter='\t')
for item in dr:
output.writerow(item)
그러나 필드 이름을 어떻게 포함할 수 있습니까?
편집:
2.7/3.2에는 새로운 방법이 있습니다.또한 John Machine의 답변은 헤더 행을 작성하는 더 간단한 방법을 제공합니다.
사용하는 간단한 예writeheader()
현재 2.7/3.2에서 사용 가능한 방법:
from collections import OrderedDict
ordered_fieldnames = OrderedDict([('field1',None),('field2',None)])
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=ordered_fieldnames)
dw.writeheader()
# continue on to write data
DictWriter를 인스턴스화하려면 필드 이름 인수가 필요합니다.
설명서에서:
fieldnames 매개 변수는 writerow() 메서드로 전달된 사전의 값이 csv 파일에 기록되는 순서를 나타냅니다.
다른 말로 하자면:Python dicts는 본질적으로 순서가 없기 때문에 Fieldnames 인수가 필요합니다.
아래는 헤더와 데이터를 파일에 쓰는 방법의 예입니다.
참고:with
문은 2.6에 추가되었습니다.2.5를 사용하는 경우:from __future__ import with_statement
with open(infile,'rb') as fin:
dr = csv.DictReader(fin, delimiter='\t')
# dr.fieldnames contains values from first row of `f`.
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
headers = {}
for n in dw.fieldnames:
headers[n] = n
dw.writerow(headers)
for row in dr:
dw.writerow(row)
@FM이 코멘트에서 언급한 것처럼, 헤더 쓰기를 다음과 같이 원-라이너로 압축할 수 있습니다.
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
dw.writerow(dict((fn,fn) for fn in dr.fieldnames))
for row in dr:
dw.writerow(row)
몇 가지 옵션:
(1) csv가 되도록 필드 이름에서 ID 매핑(즉, 아무 것도 하지 않음) 명령을 힘들게 만듭니다.DictWriter는 목록으로 다시 변환하여 csv.writer 인스턴스로 전달할 수 있습니다.
(2) 이 문서에는 "기본적인 것은writer
인스턴스(instance)" ...그러므로 그냥 사용하십시오(마지막에 example).
dw.writer.writerow(dw.fieldnames)
(3) csv를 피합니다.오버헤드를 받아쓰기하고 csv.writer로 직접 수행합니다.
데이터 쓰기:
w.writerow([d[k] for k in fieldnames])
아니면
w.writerow([d.get(k, restval) for k in fieldnames])
대신에extrasaction
"기능성"은 제가 직접 코딩하는 것을 선호합니다. 그렇게 하면 첫 번째 추가 키뿐만 아니라 키와 값으로 모든 "추가"를 보고할 수 있습니다.DictWriter에서 정말 번거로운 점은 각 Dict가 작성될 때 직접 키를 확인했다면 extraction='ignore'을 사용해야 한다는 것입니다. 그렇지 않으면 천천히(필드 이름은 목록) 확인이 반복됩니다.
wrong_fields = [k for k in rowdict if k not in self.fieldnames]
============
>>> f = open('csvtest.csv', 'wb')
>>> import csv
>>> fns = 'foo bar zot'.split()
>>> dw = csv.DictWriter(f, fns, restval='Huh?')
# dw.writefieldnames(fns) -- no such animal
>>> dw.writerow(fns) # no such luck, it can't imagine what to do with a list
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\python26\lib\csv.py", line 144, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))
File "C:\python26\lib\csv.py", line 141, in _dict_to_list
return [rowdict.get(key, self.restval) for key in self.fieldnames]
AttributeError: 'list' object has no attribute 'get'
>>> dir(dw)
['__doc__', '__init__', '__module__', '_dict_to_list', 'extrasaction', 'fieldnam
es', 'restval', 'writer', 'writerow', 'writerows']
# eureka
>>> dw.writer.writerow(dw.fieldnames)
>>> dw.writerow({'foo':'oof'})
>>> f.close()
>>> open('csvtest.csv', 'rb').read()
'foo,bar,zot\r\noof,Huh?,Huh?\r\n'
>>>
이를 위한 또 다른 방법은 출력에 선을 추가하기 전에 추가하는 것입니다. 다음 선입니다.
output.writerow(dict(zip(dr.fieldnames, dr.fieldnames)))
우편물은 동일한 값을 포함하는 더블렛 목록을 반환합니다.이 목록을 사용하여 사전을 시작할 수 있습니다.
writer.writeheader()
위는 매력적으로 작용합니다.당신의 것을 추가하는 것을 잊지 마세요.fieldnames
사용자의 초기화 시 속성csv.DictWriter
언급URL : https://stackoverflow.com/questions/2982023/how-to-write-header-row-with-csv-dictwriter
'programing' 카테고리의 다른 글
속성으로 인해 Java 코드가 컴파일되지 않습니다. 상수 식 오류여야 합니다. (0) | 2023.10.28 |
---|---|
VBA를 사용하여 Excel의 셀에 텍스트 추가 (0) | 2023.10.28 |
php myadmin에서 sql을 업로드할 때 오류가 발생했습니다. (0) | 2023.10.28 |
MariaDB Database [JAVA]에 연결할 수 없습니다. (0) | 2023.10.28 |
NetBeans의 JSTestDriver가 어설션 실패 후 테스트를 중지함 (0) | 2023.10.28 |