목차
1. CSV

CSV (Comma Separated Values)는 표 형태의 데이터를 저장하는 텍스트 파일 형식이다.
각 줄은 하나의 레코드를 나타내고, 쉼표(,)로 각 필드를 구분한다.
CSV 파일은 텍스트 편집기나 스프레드시트 프로그램 (예: Microsoft Excel, Google Sheets)으로 열고 편집할 수 있다.
https://ko.wikipedia.org/wiki/CSV_(파일_형식)
CSV (파일 형식) - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. CSV(영어: comma-separated values)는 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일이다. 확장자는 .csv이며 MIME 형식은 text/csv이다. comma-separated variables
ko.wikipedia.org
.csv 확장자를 가진 일반 텍스트 파일이라고 볼 수 있는데,
각각의 줄은 특정 데이터의 집합을 나타낸다.
선택적으로 첫번째 줄에 해당 데이터를 설명하는 헤더를 추가할 수 있다.
Name,Phone
mother,222-3333-4444
father,222-3333-5555
wife,2222-3333-6666
baby,222-3333-7777
위의 파일 내용에는 이름과 전화번호로 구성된 4개의 연락처가 있다.
첫번쨰 줄에는 데이터 해석에 도움이 되는 헤더가 포함된다.
csv 라는 파이썬 표준 라이브러리에서 제공하는 모듈을 알아보자.
하지만 상업적인 프로젝트의 경우 pandas 라는 훌륭한 라이브러리도 있다.
지금은 주제에 맞게 csv 라이브러리를 알아보자.
2. CSV 파일에서 데이터 읽기
csv 라이브러리는 csv 형식의 데이터를 읽고 쓰는 함수를 제공하는 모듈을 제공한다.
데이터 읽기는 reader 객체를 사용하여 수행되고,
데이터 쓰기는 writher 객체를 사용하여 수행된다.
- reader() 함수
import csv
with open("contacts.csv", newline='') as csv_file:
reader = csv.reader(csv_file, delimiter=',')
for row in reader:
print(row)
csv 모듈의 reader 함수는 csv 파일의 각 줄을 반복할 수 있는 객체를 반환한다.
객체를 생성하기 위해서는, 파일 객체를 reader 함수에 전달해야하는데, 이를 위해 open을 사용하여 파일 객체를 만든다.
['Name', 'Phone']
['mother', '222-3333-4444']
['father', '222-3333-5555']
['wife', '2222-3333-6666']
['baby', '222-3333-7777']
열려있는 파일과 파일 내 구분하는데 사용되는 구분 기호를 인수를 통해 전달한다.
만약 구분 기호가 쉼표인 경우 두번째 인수는 생략할 수있다.
즉, 현재의 코드 내에서는 생략할 수 있으나, 다른 구분자로 이루어진 경우 이렇게 구분자를 지정할 수있다.
newline='' 에 추가된 인수는 open 사용시 다양한 플랫폼에서 줄바꿈 문자가 잘못 해석되는 것을 방지할 수 있다.
- join과 함께 활용하기
import csv
with open("contacts.csv", newline='') as csv_file:
reader = csv.reader(csv_file, delimiter=',')
for row in reader:
print(','.join(row))
Name, Phone
mother, 222-3333-4444
father, 222-3333-5555
wife, 2222-3333-6666
baby, 222-3333-7777
- DictReader()
import csv
with open("contacts.csv", newline='') as csv_file:
reader = csv.DictReader(csv_file)
for row in reader:
print(row['Name'], ":", row['Phone'])
mother : 222-3333-4444
father : 222-3333-5555
wife : 2222-3333-6666
baby : 222-3333-7777
각 줄이 딕셔너리에 매핑되어 값의 접근에 편리한 방법을 제공한다.
reader 함수와 마찬가지로 DictReader 클래스는 파일 객체를 인수로 받는다.
파일의 첫 줄을 키를 읽는 헤더로 취급하기 때문에 없다면 fieldnames 인수를 활용하여 헤더를 정의해야한다.
- Header가 없는 경우
contacts = """mother,222-3333-4444
father,222-3333-5555
wife,2222-3333-6666
baby,222-3333-7777"""
with open("no_header_contacts.csv", "w") as f:
f.write(contacts)
import csv
with open("no_header_contacts.csv", newline='') as csv_file:
header = ['Name', 'Phone']
reader = csv.DictReader(csv_file, fieldnames=header)
for row in reader:
print(row['Name'], ":", row['Phone'])
참고로 파일에 있는 값보다 많은 열 이름을 정의하면 누락된 값에 대해서는 None을 표현한다.
with open("no_header_contacts.csv", newline='') as csv_file:
header = ['Name', 'Phone','age']
reader = csv.DictReader(csv_file, fieldnames=header)
for row in reader:
print(row['Name'], ":", row['Phone'] ,"-> header_over :", row['age'])
mother : 222-3333-4444 -> header_over : None
father : 222-3333-5555 -> header_over : None
wife : 2222-3333-6666 -> header_over : None
baby : 222-3333-7777 -> header_over : None
3. CSV 파일 작성하기
- writer.writerow()
import csv
with open("contacts.csv", "w", newline='') as csv_file:
writer = csv.writer(csv_file, delimiter=',')
writer.writerow(['Name', 'Phone'])
writer.writerow(['mother', '222-3333-4444'])
writer.writerow(['father', '222-3333-5555'])
writer.writerow(['wife', '2222-3333-6666'])
writer.writerow(['baby', '222-3333-7777'])
CSV 파일에 데이터를 저장하기 위한 작업은 writer 객체를 사용한다.
예제 코드에서는 먼저 파일 쓰기 모드를 통해 파일 객체를 생성하고,
writer 객체를 사용하여 행을 추가하는데 사용할 writerow 메서드를 사용하는데 리스트의 형태로 CSV 파일 한 줄 저장한다.
- writer(file_object ,quotechar = , quoting= )
CSV 파일에서 값을 구분하는 데 사용되는 구분 기호가 포함된 연락처가 추가된다는 것을 상상해볼 것.
기본적으로 이러한 값은 따옴표로 묶여 있지만 단일문자여야 하는 인수(quotechar)를 사용하여 이를 변경할 수 있다.
import csv
with open("quote_contacts.csv", "w", newline='') as csv_file:
writer = csv.writer(csv_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['Name', 'Phone'])
writer.writerow(['mother', '222-3333-4444'])
writer.writerow(['father', '222-3333-5555'])
writer.writerow(['wife', '2222-3333-6666'])
writer.writerow(['baby', '222-3333-7777'])
writer.writerow(['grandmother,grandfather', '222-3333-7777']) #문자열에 ,와 같은 기호가 들어감.
- writer() 함수의 추가 인자
| quotechar= | 필드에 구분자나 줄바꿈 문자가 포함될 경우 해당 필드를 감쌀 문자 (여기서는 큰따옴표) | |
| quoting= | 인용(quoting) 방식을 지정 | |
| csv.QUOTE_ALL | 모든 필드를 quotechar로 감쌈 | |
| csv.QUOTE_NONNUMERIC | 숫자가 아닌 모든 필드를 quotechar로 감쌈. 숫자인 경우 감싸지 않음 |
|
| csv.QUOTE_NONE | 어떤 필드도 quotechar로 감싸지 않음. | |
| csv.QUOTE_MINIMAL | 필드 내에 구분 문자(delimiter), 인용 문자(quotechar), 또는 줄 바꿈 문자(lineterminator)가 포함되어 있는 경우에만 해당 필드를 quotechar로 감쌈 | |
['Name', 'Phone']
['mother', '222-3333-4444']
['father', '222-3333-5555']
['wife', '2222-3333-6666']
['baby', '222-3333-7777']
['grandmother,grandfather', '222-3333-7777']
- DictWriter(file_object, fieldnames= )
DictReader 클래스 객체를 활용하여 파일을 읽은 것과 같이 작성시에도 사용할 수 있는 DictWriter 클래스가 있다.
import csv
with open("contacts.csv", "w", newline='') as csv_file:
fieldnames = ['Name', 'Phone']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader() #header 작성
writer.writerow({'Name': 'mother', 'Phone': '222-3333-4444'})
writer.writerow({'Name': 'father', 'Phone': '222-3333-5555'})
writer.writerow({'Name': 'wife', 'Phone': '2222-3333-6666'})
writer.writerow({'Name': 'baby', 'Phone': '222-3333-7777'})
writer.writerow({'Name': 'grandmother,grandfather', 'Phone': '222-3333-7777'})
해당 클래스는 DictReader와 같이 Header를 정의하기 위해 리스트형의 fieldnames 가 인자로 필요하다.
인자를 통해 전달받은 header를 DictWriter 객체의 writeheader()메서드를 통해 첫줄에 헤더를 추가한다.
'Development > Python' 카테고리의 다른 글
| [python] configparser 모듈 (2) | 2025.07.18 |
|---|---|
| [python] Logging, logging 모듈 (2) | 2025.07.17 |
| [python] XML , XML 문서의 CRUD (0) | 2025.07.15 |
| [python] SQLite, sqlite3을 활용한 CRUD (1) | 2025.07.14 |
| [python] requests CRUD (3) | 2025.07.14 |