본문 바로가기

코딩/파이썬 표준 라이브러리

[CSV] 5장. CSV 파일을 딕셔너리로 읽기

 

만약 쉼표로 구분되어 있는 CSV 파일이 아래와 같고,

 

#,언어,경험
1,C,True
2,C++,True
3,C#,True
4,python,True
5,java,True

 

csv.DictReader 클래스 정의 시 fieldnames 전달인자 값을 정의하지 않으면, CSV 파일의 첫번째 라인 내 데이터를 기준으로 각 라인의 값을 딕셔너리 형태로 읽어올 수 있습니다.

 

import csv

with open('python_csv_05_read_dict_1.csv', mode='rt', encoding='utf-8') as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row)

 

{'#': '1', '언어': 'C', '경험': 'True'}
{'#': '2', '언어': 'C++', '경험': 'True'}
{'#': '3', '언어': 'C#', '경험': 'True'}
{'#': '4', '언어': 'python', '경험': 'True'}
{'#': '5', '언어': 'java', '경험': 'True'}

 

만약 csv.DictReader 클래스 정의 시 fieldnames 전달인자 값을 지정하면,

 

import csv

with open('python_csv_05_read_dict_1.csv', mode='rt', encoding='utf-8') as f:
    # reader = csv.DictReader(f)
    reader = csv.DictReader(f, fieldnames=['A', 'B', 'C'])
    for row in reader:
        print(row)

 

그 결과는 다음과 같이 바뀌게 됩니다.

 

{'A': '#', 'B': '언어', 'C': '경험'}
{'A': '1', 'B': 'C', 'C': 'True'}
{'A': '2', 'B': 'C++', 'C': 'True'}
{'A': '3', 'B': 'C#', 'C': 'True'}
{'A': '4', 'B': 'python', 'C': 'True'}
{'A': '5', 'B': 'java', 'C': 'True'}

 

csv 모듈의 DicReader 클래스에서 fieldnames의 기본값은 None으로 정의되어 있습니다.

 

class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

 

CSV 파일의 데이터를 딕셔너리 형태로 읽어올 때 아래와 같이 열의 데이터와 행의 데이터 개수가 일치하지 않으면,

 

#,언어,경험,선호
1,C,True,yes
2,C++,True
3,C#,True
4,python,True,yes,관심 많아요
5,java,True
6,go

 

다음과 값이 일치하지 않는 딕셔너리의 key 또는 value 값은 None이 됩니다.

 

{'#': '1', '언어': 'C', '경험': 'True', '선호': 'yes'}
{'#': '2', '언어': 'C++', '경험': 'True', '선호': None}
{'#': '3', '언어': 'C#', '경험': 'True', '선호': None}
{'#': '4', '언어': 'python', '경험': 'True', '선호': 'yes', None['관심', '많아요']}
{'#': '5', '언어': 'java', '경험': 'True', '선호': None}
{'#': '6', '언어': 'go', '경험': None, '선호': None}