crossorigin="anonymous"> [데이터 분석] Chapter 01-3. 데이터 다운로드 및 인코딩

프로그래밍/Python & 데이터 분석

[데이터 분석] Chapter 01-3. 데이터 다운로드 및 인코딩

Writing coder 2026. 1. 24. 22:29
반응형

❇️ 목적

1. 데이터 분석으로 비즈니스 문제를 어떻게 해결하는지 알아보기 위해 가상의 예를 이용합니다.

2. 코랩에서 판다스 데이터프레임으로 CSV 파일을 읽고 쓰는 방법에 대해 배웁니다.

 

✅ $ gdown.download

gdown 패키지는 구글 드라이브를 포함하여 웹에서 대용량 파일을 다운로드 할 수 있음.

# 구글 드라이브에서 다운로드

import gdown
gdown.download('https://bit.ly/3eecMKZ', '남산도서관 장서 대출목록 (2021년 04월).csv', quiet = False)

Downloading...
From: https://bit.ly/3eecMKZ
To: /content/남산도서관 장서 대출목록 (2021년 04월).csv
100%|██████████| 58.1M/58.1M [00:00<00:00, 180MB/s]
'남산도서관 장서 대출목록 (2021년 04월).csv'

 

✅ Encoding (형태:utf-8 or EUC-KR -> chardet으로 확인)

바로 다운로드 후, 불러오면 오류가 생깁니다.

# csv 파일 출력하기

with open('남산도서관 장서 대출목록 (2021년 04월).csv') as f:
  print(f.readline())
  
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
/tmp/ipython-input-4075738087.py in <cell line: 0>()
      2 
      3 with open('남산도서관 장서 대출목록 (2021년 04월).csv') as f:
----> 4   print(f.readline())

/usr/lib/python3.12/codecs.py in decode(self, input, final)

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb9 in position 0: invalid start byte

 

chardet를 이용해 데이터의 타입을 확인할 수 있습니다.

▶️ UTF-8이면 오류가 나지 않지만, EUC-KR로 쓰여진것을 확인 했기 때문에 오류가 났던 것임을을 확인할 수 있습니다.

import chardet

with open('남산도서관 장서 대출목록 (2021년 04월).csv', mode = 'rb') as f:
  d=f.readline()
print(chardet.detect(d))

{'encoding': 'EUC-KR', 'confidence': 0.99, 'language': 'Korean'}

 

▶️ open method에 encoding 매개변수안에 'EUC-KR'을 전달하여 출력하니 열 이름과 첫번째 줄이 출력 되는것을 확인 할 수 있습니다.

with open('남산도서관 장서 대출목록 (2021년 04월).csv', encoding = 'EUC-KR') as f:
  print(f.readline())
  print(f.readline())
  
 번호,도서명,저자,출판사,발행년도,ISBN,세트 ISBN,부가기호,권,주제분류번호,도서권수,대출건수,등록일자,
"1","인공지능과 흙","김동훈 지음","민음사","2021","9788937444319","","","","","1","0","2021-03-19",

 

⏹️ NFD (Mac OS) VS NFC  (Window & Linux)

MacOS에서 작업했던 파일을 window나 Linux에서 불러오면 아래 주석과 같이 불러와 지는 경우가 있습니다.

그런 경우 아래처럼 파일 포맷을 변경하여 불러올 수 있습니다.

# NFD (ex. ㅎㅗㄴㄱㅗㅇ) -> NFC (ex. 혼공)

import os
import glob
import unicodedata
for filename in glob.glob('*.csv'):
  nfc_filename = unicodedata.normalize('NFC', filename)
  os.rename(filename, nfc_filename)

 

데이터프레임 다루기: pandas

▶️ pandas.read_csv: Tabular data: 표형식 데이터을 읽는 pandas 패키지의 method

  • read_csv(): 같은 열에 어떤 종류의 데이터가 저장되어 있는지 자동으로 파악
  • 메모리를 효율적으로 사용하기 위해 CSV 파일을 나눠 읽음
  • 이때, 자동으로 파악한 데이터 타입이 달라지면 경고가 발생
import pandas as pd

df = pd.read_csv('남산도서관 장서 대출목록 (2021년 04월).csv', encoding = 'EUC-KR')

/tmp/ipython-input-3429453271.py:3: DtypeWarning: Columns (5,6,9) have mixed types. Specify dtype option on import or set low_memory=False.
  df = pd.read_csv('남산도서관 장서 대출목록 (2021년 04월).csv', encoding = 'EUC-KR')

 

▶️ low_memory = False를 사용해서 나눠 읽지 않고 한번에 읽도록 함.

# low_memory = False -> 한번에 나눠 읽기
df = pd.read_csv('남산도서관 장서 대출목록 (2021년 04월).csv', encoding = 'EUC-KR', low_memory = False)

 

▶️ dtype = {''}

  • 데이터의 크기가 큰 경우 low_memory = False 면 memory가 다운됨
  • 해당하는 데이터를 dtype 매개 변수를 이용해 data type을 정해줄 수 있음.
df = pd.read_csv('남산도서관 장서 대출목록 (2021년 04월).csv', encoding = 'euc-kr', 
                 dtype = {'ISBN': str, '세트 ISBN': str, '주제분류번호': str})
df.head()
# 마지막에 ,를 인식해서 새로운 칼럼이 하나 더 생김.
# 이는 나중에 처리해야 함.

df.head()의 결과

 

▶️ 첫 행이 열 이름이 없는 경우라면

  • header = None
  • names = {'column name'}

 

▶️  df.to_csv: default로 UTF-8 형식으로 데이터를 CSV 형태로 저장합니다.

출력의 맨 앞에 0,1 이 또 생겨 있는 것을 확인했다.

df.to_csv('ns_202104.csv')

with open('ns_202104.csv') as f:
  for i in range(3):
    print(f.readline(), end = '')
    
,번호,도서명,저자,출판사,발행년도,ISBN,세트 ISBN,부가기호,권,주제분류번호,도서권수,대출건수,등록일자,Unnamed: 13
0,1,인공지능과 흙,김동훈 지음,민음사,2021,9788937444319,,,,,1,0,2021-03-19,
1,2,가짜 행복 권하는 사회,김태형 지음,갈매나무,2021,9791190123969,,,,,1,0,2021-03-19,

 

read_csv로 저장한 파일을 data frame 형태로 불러와서 보면 앞에 index 값과 똑같이 "Unammed:0" 으로 칼럼이 하나 더 생겼다.

ns_df = pd.read_csv('ns_202104.csv', low_memory = False)
ns_df.head()

불필요한 Index 칼럼이 또 추가 되어 있음.

 

▶️ index_col: Index가 이미 파일 안에 있다는 것을 알려기 위해 사용 => 인덱스 칼럼을 따로 또 저장하지 않게 할 수 있다.

ns_df = pd.read_csv('ns_202104.csv', index_col = 0 ,low_memory = False)
ns_df.head()

index_col = 0 지정 후에 불필요 column이 없어진 것을 알 수 있음.

 

▶️ to_csv의 index = False: 저장 할 때 부터 인덱스를 저장하지 않음. => 따로 불러올 때, 인덱스를 없애지 않아도 됨.

ns_df = df.to_csv('ns_202104.csv', index = False)
with open('ns_202104.csv') as f:
  for i in range(3):
    print(f.readline())
    
번호,도서명,저자,출판사,발행년도,ISBN,세트 ISBN,부가기호,권,주제분류번호,도서권수,대출건수,등록일자,Unnamed: 13

1,인공지능과 흙,김동훈 지음,민음사,2021,9788937444319,,,,,1,0,2021-03-19,

2,가짜 행복 권하는 사회,김태형 지음,갈매나무,2021,9791190123969,,,,,1,0,2021-03-19,

 

⏹️ to_excel & xlswriter

ns_df.to_excel('ns_202104', index = False)

위 형태로 엑셀로도 저장 가능

판다스는 엑셀 파일을 만들 때, 기본적으로 openpyxl package를 사용함. 이는 한글에서 오류를 유발하기 때문에, xlsxwriter 패키지를 사용 to_excel 사용시 engine 매개변수를 'xlswriter'로 지정해주면 됨.

 

!pip install xlsxwriter
ns_df.to_excel('ns_202104', index = False, engine = 'xlsxwriter')

 

 

 

# 혼자공부하는 데이터 분석 with 파이썬 (저자: 박해선)을 보고 공부를 위해 작성하였습니다.

반응형