CSV (Comma-Separated Value)
테이블 형식 데이터 형식 (tabular data format)이다 (ex: 테이블의 데이터 또는 데이터베이스의 데이터일 수 있음).
이 형식에서 파일의 각 행은 테이블의 행이다. 형식 이름에도 불구하고 구분 기호는 쉼표일 수 없다. 구분 기호가 다른 형식은 고유한 이름을 가질 수 있다 (ex: TSV (탭으로 구분된 값)). 그러나 CSV라는 이름은 일반적으로 모든 구분 기호를 의미한다.
# Example of a CSV file (sw_data.csv)
hostname,vendor,model,location
sw1,Cisco,3750,London
sw2,Cisco,3850,Liverpool
sw3,Cisco,3650,Liverpool
sw4,Cisco,3650,London
csv.reader는 반복자를 반환한다.
import csv
with open('sw_data.csv') as f:
reader = csv.reader(f)
print(reader)
<_csv.reader object at 0x10385b050>
필요한 경우 다음과 같은 방법으로 목록으로 변환할 수 있다.
with open('sw_data.csv') as f:
reader = csv.reader(f)
print(list(reader))
[['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London'], ['sw2', 'Cisco', '3850', 'Liverpool'], ['sw3', 'Cisco', '3650', 'Liverpool'], ['sw4', 'Cisco', '3650', 'London']]
대부분의 경우 열 헤더는 별도의 개체로 얻는 것이 더 편리하다. 이것은 다음과 같은 방식으로 수행할 수 있다 (csv_read_headers.py 파일).
import csv
with open('sw_data.csv') as f:
reader = csv.reader(f)
headers = next(reader)
print('Headers: ', headers)
for row in reader:
print(row)
때로는 키가 열 이름이고 값이 열 값인 사전을 얻는 것이 더 편리하다. 이를 위해 모듈에는 DictReader (csv_read_dict.py 파일)이 있다.
import csv
with open('sw_data.csv') as f:
reader = csv.DictReader(f)
for row in reader:
print(row)
print(row['hostname'], row['model'])
$ python csv_read_dict.py
{'hostname': 'sw1', 'vendor': 'Cisco', 'model': '3750', 'location': 'London, Globe Str 1 '}
sw1 3750
{'hostname': 'sw2', 'vendor': 'Cisco', 'model': '3850', 'location': 'Liverpool'}
sw2 3850
{'hostname': 'sw3', 'vendor': 'Cisco', 'model': '3650', 'location': 'Liverpool'}
sw3 3650
{'hostname': 'sw4', 'vendor': 'Cisco', 'model': '3650', 'location': 'London, Grobe Str 1'}
sw4 3650
Reading
import csv
with open('sw_data.csv') as f:
reader = csv.reader(f)
for row in reader:
print(row)
$ python csv_read.py
['hostname', 'vendor', 'model', 'location']
['sw1', 'Cisco', '3750', 'London']
['sw2', 'Cisco', '3850', 'Liverpool']
['sw3', 'Cisco', '3650', 'Liverpool']
['sw4', 'Cisco', '3650', 'London']
첫 번째 목록에는 열 이름이 포함되고 나머지 목록에는 해당 값이 포함된다.
Writing
csv 모듈을 사용하여 CSV 형식 (csv_write.py 파일)의 파일에 데이터를 쓸 수 있다.
import csv
data = [['hostname', 'vendor', 'model', 'location'],
['sw1', 'Cisco', '3750', 'London, Best str'],
['sw2', 'Cisco', '3850', 'Liverpool, Better str'],
['sw3', 'Cisco', '3650', 'Liverpool, Better str'],
['sw4', 'Cisco', '3650', 'London, Best str']]
with open('sw_data_new.csv', 'w') as f:
writer = csv.writer(f)
for row in data:
writer.writerow(row)
with open('sw_data_new.csv') as f:
print(f.read())
$ python csv_write.py
hostname,vendor,model,location
sw1,Cisco,3750,"London, Best str"
sw2,Cisco,3850,"Liverpool, Better str"
sw3,Cisco,3650,"Liverpool, Better str"
sw4,Cisco,3650,"London, Best str"
목록의 문자열이 파일에 작성된 다음 파일의 내용이 표준 출력 스트림에 표시된다. 마지막 열의 문자열은 따옴표로 묶이고 다른 값은 따옴표로 묶지 않는다.
마지막 열의 모든 문자열에 쉼표가 있기 때문이다. 그리고 따옴표는 전체 문자열이 무엇인지 나타낸다. 쉼표가 따옴표 안에 있으면 csv 모듈은 이를 구분 기호로 인식하지 않는다.
때로는 모든 문자열을 따옴표로 묶는 것이 더 좋다. 물론, 이 경우 예제는 충분히 간단하지만 문자열에 더 많은 값이 있을 때 따옴표는 값의 시작과 끝을 나타낸다.
Csv 모듈을 사용하면 이를 제어할 수 있다. 따옴표가 있는 CSV 파일에 모든 문자열을 작성하려면 다음과 같이 스크립트를 변경해야 한다 (csv_write_quoting.py 파일).
import csv
data = [['hostname', 'vendor', 'model', 'location'],
['sw1', 'Cisco', '3750', 'London, Best str'],
['sw2', 'Cisco', '3850', 'Liverpool, Better str'],
['sw3', 'Cisco', '3650', 'Liverpool, Better str'],
['sw4', 'Cisco', '3650', 'London, Best str']]
with open('sw_data_new.csv', 'w') as f:
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
for row in data:
writer.writerow(row)
with open('sw_data_new.csv') as f:
print(f.read())
$ python csv_write_quoting.py
"hostname","vendor","model","location"
"sw1","Cisco","3750","London, Best str"
"sw2","Cisco","3850","Liverpool, Better str"
"sw3","Cisco","3650","Liverpool, Better str"
"sw4","Cisco","3650","London, Best str"
이제 모든 값이 인용된다. 그리고 모델 번호는 원래 목록에서 문자열로 제공되므로 여기에도 인용된다. writerow방법 외에 방법 writerows이 지원된다. 모든 반복 가능한 객체를 허용한다.
따라서, 이전 예제는 다음과 같이 작성할 수 있다 (csv_writerows.py 파일).
import csv
data = [['hostname', 'vendor', 'model', 'location'],
['sw1', 'Cisco', '3750', 'London, Best str'],
['sw2', 'Cisco', '3850', 'Liverpool, Better str'],
['sw3', 'Cisco', '3650', 'Liverpool, Better str'],
['sw4', 'Cisco', '3650', 'London, Best str']]
with open('sw_data_new.csv', 'w') as f:
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
writer.writerows(data)
with open('sw_data_new.csv') as f:
print(f.read())
DictWriter
DictWriter은 CSV 형식으로 사전을 작성할 수 있다. 일반적으로 DictWriter와 writer 같이 작동하지만 사전은 순서가 지정되지 않으므로 파일에서 열의 순서를 지정해야 한다. 이 fieldnames옵션이 사용된다 (csv_write_dict.py 파일).
import csv
data = [{
'hostname': 'sw1',
'location': 'London',
'model': '3750',
'vendor': 'Cisco'
}, {
'hostname': 'sw2',
'location': 'Liverpool',
'model': '3850',
'vendor': 'Cisco'
}, {
'hostname': 'sw3',
'location': 'Liverpool',
'model': '3650',
'vendor': 'Cisco'
}, {
'hostname': 'sw4',
'location': 'London',
'model': '3650',
'vendor': 'Cisco'
}]
with open('csv_write_dictwriter.csv', 'w') as f:
writer = csv.DictWriter(
f, fieldnames=list(data[0].keys()), quoting=csv.QUOTE_NONNUMERIC)
writer.writeheader()
for d in data:
writer.writerow(d)
Delimiter (구분자)
때때로 다른 값이 구분 기호로 사용된다. 이 경우 사용할 구분 기호를 모듈에 알릴 수 있어야 한다. 예를 들어, 파일이 구분 기호를 사용하는 경우는 다음과 같다 (sw_data2.csv 파일).
hostname;vendor;model;location
sw1;Cisco;3750;London
sw2;Cisco;3850;Liverpool
sw3;Cisco;3650;Liverpool
sw4;Cisco;3650;London
reader에서 사용되는 구분 기호를 지정하기만 하면 된다.
import csv
with open('sw_data2.csv') as f:
reader = csv.reader(f, delimiter=';')
for row in reader:
print(row)
https://pyneng.readthedocs.io/en/latest/book/17_serialization/csv.html
'Programming > Python' 카테고리의 다른 글
UnicodeEncodeError: 'cp949' codec can't encode character illegal multibyte sequence (0) | 2022.08.17 |
---|---|
[Python] JSON (JavaScript Object Notation) (0) | 2022.08.17 |
[Python] datetime (0) | 2022.08.17 |
[Python] zip (0) | 2022.08.07 |
[Python] Logging Module (0) | 2022.02.21 |