2.3 csv 파일 다루기 Last updated: 2023-10-31 18:36:02

csv 파일을 저장하는 방법에 대해 설명한다. csv 파일 읽을 때와 마찬가지로 csv 모듈을 사용하는 방법과 판다스를 사용하는 방법에 대해 설명한다.

2.4.1 csv모듈로 csv 파일 쓰기

csv 모듈로 파일 쓰기를 하려면 csv.writer( ) 함수를 이용한다. 읽을 때와 마찬가지로 파일을 열어서 csv 모듈에 전달해야 하는데, 이 때 주의할 점은 파일을 쓰기 모드로 열어야 한다.

형식

csv_rdr = csv.reader(f, delimiter, quotechar, quoting)

파라미터

• f (file) : open( ) 함수를 이용해 읽은 csv 파일 객체이다.
• delimiter (string) : (선택) 컬럼 구분 기호, 기본값은 쉼표(','), 파일에 따라 공백문자(' '), 탭문자('\t'), 세미콜론(';') 등이 사용될 수 있다.
• quotechar (string) : (선택) delimiter나 개행 문자등의 문자를 포함하는 필드를 처기하기 위한 문자로 필드 시작과 끝에 사용한다. 기본값은 쌍따옴표('"')이다.
• quoting (string) : (선택) quotechar의 사용 방법을 지정하며 선택 옵션은 다음을 참조한다.
 - csv.QUOTE_ALL: 모든 필드에 사용
 - csv.QUOTE_MINIMAL: delimiter, quotechar, lineterminator 등이 포함된 필드만 사용
 - csv.QUOTE_NONNUMERIC: 숫자가 아닌 모든 필드에 사용
 - csv.QUOTE_NONE: 사용하지 않음, 따라서 필드에 delimiter, quotechar, lineterminator 등이 포함되어 있다면 앞에 escapechar를 추가해 주어야 오류가 나지 않음.

반환

csv 리더 객체, 이 객체를 이용해 csv 내용을 체계적으로 읽어올 수 있음

csv.writer( ) 함수를 사용하는 예제는 다음과 같다.


[예제 6- 53] csv 파일 쓰기

# [1] 모듈 import
import csv

# [2] 데이터 선언
home_appliance_inventory = [
    ['pid', 'pname', 'price', 'amount'],
    ['0001', 'refrigerator', 1200000, 51],
    ['0002', 'washing machine', 300000, 64],
    ['0003', 'vacuum cleaner', 100000, 42],
    ['0004', 'dish wash machine', 200000, 32]
]

# [3] 파일 오픈
with open("home_appliance_inventory.csv", "w") as f:
    # [4] csv.writer 객체 생성
    writer = csv.writer(f)
    
    # [5] 데이터 쓰기
    writer.writerows(home_appliance_inventory)

[결과]

pid,pname,price,amount
0001,refrigerator,1200000,51
0002,washing machine,300000,64
0003,vacuum cleaner,100000,42
0004,dish wash machine,200000,32

위 예제에 대해 설명한다.

  • [1]에서 csv 모듈을 import 한다.

  • [2]에서 csv 파일로 저장할 데이터를 선언한다. 전체 데이터는 각 줄을 포함하는 리스트 혹은 튜플 형태여야 한다. 세트나 딕셔너리는 항목의 순서를 보장할 수 없기 때문에 사용하면 안된다.

  • [3]에서 파일을 쓰기 모드로 연다.

  • [4]에서 csv.writer 객체를 생성한다.

  • [5]에서 writer의 writerrows( ) 메서드를 이용해 데이터를 파일로 기록한다.

  • 결과를 보면 각 줄이 정상적으로 기록된 것을 확인할 수 있다.

csv 파일 저장 옵션을 사용하는 예제에 대해 알아보자.

다음은 delimiter를 변경하는 예제이다.


[예제 6- 54] 옵션 변경해서 csv 파일 쓰기

# [1] 모듈 import
import csv

# [2] 데이터 선언
home_appliance_inventory = [
    ('제품코드', '제품명', '가격', '수량'),
    ('0001', 'refrigerator', 1200000, 51),
    ('0002', 'washing machine', 300000, 64),
    ('0003', 'vacuum cleaner', 100000, 42),
    ('0004', 'dish wash machine', 200000, 32)
]

# [3] 파일 오픈
with open("home_appliance_inventory1.csv", "w", encoding='utf8') as f:
    # [4] csv.writer 객체 생성
    writer = csv.writer(f, delimiter=':', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
    
    # [5] 데이터 쓰기
    writer.writerows(home_appliance_inventory)

[결과]

"제품코드":"제품명":"가격":"수량"
"0001":"refrigerator":1200000:51
"0002":"washing machine":300000:64
"0003":"vacuum cleaner":100000:42
"0004":"dish wash machine":200000:32

위 예제에 대해 설명한다.

  • [1]에서 csv 모듈을 import 한다.

  • [2]에서 csv 파일로 저장할 데이터를 선언한다. 데이터는 튜플 형태이다.

  • [3]에서 파일을 쓰기 모드로 연다. 데이터에 한글이 포함되어 있으므로 encoding을 UTF-8로 지정하였다.

    • [4]에서 csv.writer 객체를 생성한다. 옵션으로 delimiter는 콜론(':') 문자를 사용하였고, quotechar로 쌍 따옴표('”')를 사용하며, quoting 옵션은 숫자가 아닌 경우에 적용하도록 하였다.

  • [5]에서 writer의 writerrows( ) 메서드를 이용해 데이터를 파일로 기록한다.

  • 결과를 보면 각 줄이 정상적으로 쓰여졌고, 숫자형이 아닌 문자열 필드인 경우 쌍따옴표('”')로 둘러싸여 있다.


2.4.2 Pandas로 csv 파일 쓰기

판다스를 이용하면 csv 파일을 좀더 쉽게 생성할 수 있다. csv 모듈보다 다양한 옵션을 제공한다. 단 주의할 것은 판다스를 이용하려면 데이터를 판다스에서 지원하는 DataFrame 형식으로 변환해야 한다. 일단 DataFrame 데이터를 생성하고 나면 csv 파일이나 excel 파일과 같은 다른 형태로 손쉽게 변환 및 저장이 가능하다. 판다스로 csv 파일을 쓰는 형식은 다음과 같다.

형식

df = pandas.read_csv(path, encoding=None)

파라미터

• path (string) : 읽을 csv 경로 및 파일명을 전달한다.
• encoding (string) : (선택) 기본값은 None, 텍스트 파일의 문자열 인코딩 형식을 지정한다.

반환

파일을 읽은 후 Pandas의 DataFrame 객체가 반환된다.

참고

다음은 리스트 데이터를 판다스의 데이터 프레임으로 변환하고, csv 파일로 저장하는 예제이다.


[예제 6- 55] 판다스의 DataFrame으로 csv 파일 쓰기

# [1] 모듈 import
import csv
import pandas as pd

# [2] 데이터 선언
home_appliance_inventory = [
    ['pid', 'pname', 'price', 'amount'],
    ['0001', 'refrigerator', 1200000, 51],
    ['0002', 'washing machine', 300000, 64],
    ['0003', 'vacuum cleaner', 100000, 42],
    ['0004', 'dish wash machine', 200000, 32]
]

# [3] DataFrame 생성
df = pd.DataFrame(home_appliance_inventory[1:], columns=home_appliance_inventory[0])

# [4] csv 파일 쓰기
df.to_csv("home_appliance_inventory2.csv", sep=',', index=False)

[결과]

pid,pname,price,amount
0001,refrigerator,1200000,51
0002,washing machine,300000,64
0003,vacuum cleaner,100000,42
0004,dish wash machine,200000,32

위 예제에 대해 설명한다.

  • [1]에서 csv와 pandas 모듈을 import 한다.

  • [2]에서 리스트로 항목이 구성된 데이터를 선언한다.

  • [3]에서 리스트를 DataFrame으로 변환한다. 첫 번째 파라미터는 데이터 부분이므로 두 번째 항목부터 끝까지 전달하고, 두 번째 파라미터는 각 컬럼의 이름을 지정하는 것으로 리스트 데이터의 첫 번째 항목을 전달한다.

  • [4]에서 저장할 파일명과 구분자를 입력하고 csv 파일을 생성한다. index값은 파일을 저장할 때 DataFrame에서 자동으로 생성된 index를 파일에 저장할지 여부를 뜻하는데 우리가 원하는 값이 아니므로 index를 제외하고 파일을 저장한다.

  • 결과를 보면 예상대로 파일이 생성되었다.

판다스를 통해 csv 파일을 저장할 때 csv 모듈과 같이 여러 옵션을 지정할 수 있다.


[예제 6- 56] 판다스의 DataFrame을 옵션 주어 csv 파일 쓰기

# [1] 모듈 import
import csv
import pandas as pd

# [2] 데이터 선언
home_appliance_inventory = [
    ['pid', 'pname', 'price', 'amount'],
    ['0001', 'refrigerator', 1200000, 51],
    ['0002', 'washing machine', 300000, 64],
    ['0003', 'vacuum cleaner', 100000, 42],
    ['0004', 'dish wash machine', 200000, 32]
]

# [3] DataFrame 생성
df = pd.DataFrame(home_appliance_inventory[1:], columns=home_appliance_inventory[0])

# [4] csv 파일 쓰기
df.to_csv("home_appliance_inventory3.csv", sep=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC, index=False)

[결과] home_appliance_inventory3.csv 파일

"pid","pname","price","amount"
"0001","refrigerator",1200000,51
"0002","washing machine",300000,64
"0003","vacuum cleaner",100000,42
"0004","dish wash machine",200000,32

위 예제에 대해 설명한다.

  • [1]~[3]의 내용은 앞의 예제와 동일하다.

  • [4]에서 csv 파일을 저장할 때 quotechar 옵션과 quoting 옵션을 추가했다.

  • 결과를 보면 원하는대로 문자열 필드의 시작과 끝에 quotechar인 따옴표(“) 문자가 추가되었다.