본문 바로가기
python

pandas를 이용하여 csv row 추출하기

by 황인태(intaehwang) 2020. 6. 11.
반응형

공공데이터포털에서 크롤링하여 국토관리, 사회복지 관련 자료를 다운받아 엑셀작업을 하는 임무를 부여받았다.

국토관리는 1,694건, 사회복지는 2,210건으로 크롤링 할때 데이터를 다 받으면 좋겠지만 다운로드 형식이 각각 csv, xlsx 가끔씩 hwp, zip 파일이 업로드 되어있다. 또 링크를 접소하여 해당 홈페이지에서 다운을 받아야하는 자료도 있기 때문에 공공데이터포털에서 리스트만 추출하였다.

약 3,900개의 자료를 다운받아서 해당 파일의 데이터를 보고 엑셀작업을 해야하는데 문제는 여기서 발생하였다. 각 데이터의 항목과 데이터예시를 엑셀에 저장해야하는데 이 작업이 시간이 많이 걸렸다. 반드시 코딩으로 시간 단축이 필요한 상황이였다.

예전 python으로 데이터를 추출하는 방법을 들은적이 있었다. 그래서 시도하게 되었다.

소스코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import pandas as pd
import numpy as np
import sys
import os
import glob
 
title = "86"
 
path = r'./test/case'
 
# 정렬 관련 옵션
# key=os.path.getctime 파일 생성일
# key=os.path.getatime 파일 최근 접근일
# key=os.path.getmtime 파일 최종 수정일
# key=os.path.getsize 파일 사이즈로 정렬
filenames = sorted(glob.glob(path + title + "/*.*"), key=os.path.getmtime)
 
# encoding='CP949' windows 파일 생성
tmp = []# 정렬된 csv 파일을 순서대로 읽기
for i in filenames:
 
    # 한국어로 인코딩하기
    # encoding 'CP949', 'euc_kr'은 한국어를 지원한다.
    # https://docs.python.org/3/library/codecs.html#standard-encodings
    data = pd.read_csv(i, encoding='CP949')
    a = ""
 
    # col name 읽어오기
    for j in data.head(1):
        a += j
        a += " "
    b = ""
    
    # 내용 읽어오기
    for j in data[1:2].values:
        b += str(j)
        b += " "
 
    # tuple 형대로 배열에 저장      
    tmp.append([i, a, b])
 
# 배열을 data 형태로 저장하기
# option 중에 columns로 있다.
publicData = pd.DataFrame(data=tmp) 
print(publicData)
publicData.to_csv('./항목' + title + '.csv', encoding='utf-8-sig')
cs

 

디렉터리에 csv 파일을 다운 받아서 실행을 하면 다음과 같은 결과를 얻을 수 있다.

(2020-06-11 추가)

데이터 분리가 띄어쓰기로 되어있어 한 눈에 잘 안 들어온다는 요청사항이 있었다. 그래서 " | " 를 이용하여 분리하였다.

data.head()는 문자열로 취급하여 그냥 " | " 만 추가하면 되었다. 문제는 data[].values였다.

data.head() 처럼 같은 결과가 나오기를 기대하였지만 그렇지 않았다. 마치 하나의 문자열 처럼 작동하였다. 따라서 data[].values에서 for는 필요없게 되었고 이 문제를 어떻게 처리할까 이런 저런 기능들을 찾다가 귀찮아서 문자열로 변환하고 그냥 다 replace를 하였다. 기존 코드보다 속도는 많이 느려졌지만 서비스를 하는 코드도 아니고 ps 문제를 푸는것도 아니기 때문에 그냥 사용하기로 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import pandas as pd
import numpy as np
import sys
import os
import glob
 
title = "44"
 
path = r'./test/case'
filenames = sorted(glob.glob(path + title + "/*.csv"), key=os.path.getmtime)
 
# encoding='CP949' windows 파일 생성
tmp = []
for i in filenames:
    data = pd.read_csv(i, encoding='CP949')
    a = "| "
    for j in data.head(1):
        a += j
        a += " | "
    b = str(data[1:2].values)
    b = b.replace("' "" | ")
    b = b.replace(" '"" | ")
    b = b.replace("[""")
    b = b.replace("]""")
    b = b.replace("'""")
    b = "| " + b + " |" 
        
    tmp.append([i, a, b])
    
publicData = pd.DataFrame(data=tmp)
print(publicData)
publicData.to_csv('./항목' + title + '.csv', encoding='utf-8-sig')
cs

 

(2020-06-17 추가)

csv, excel을 따로 분리해서 작업하기가 번거로웠다. 애초에 분류하는 파일이 .csv와 excel 파일만 다운받는다. 따라서 .csv는 read_csv() 그 외는 read_excel()을 이용하기 위해 소스코드를 추가하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import pandas as pd
import numpy as np
import sys
import os
import glob
 
title = "6"
 
path = r'./test/case'
filenames = sorted(glob.glob(path + title + "/*.*"), key=os.path.getmtime)
 
# encoding='CP949' windows 파일 생성
tmp = []
for i in filenames:
    
    # 추가
    if (i[-4:] == ".csv"):
        data = pd.read_csv(i, encoding='CP949')
    else:
        data = pd.read_excel(i, encoding='CP949')
        
    a = "| "
    for j in data.head(1):
        a += j
        a += " | "
    b = str(data[1:2].values)
    b = b.replace("' "" | ")
    b = b.replace(" '"" | ")
    b = b.replace("[""")
    b = b.replace("]""")
    b = b.replace("'""")
    b = "| " + b + " |" 
    tmp.append([i, a, b])
    
publicData = pd.DataFrame(data=tmp) 
print(publicData)
publicData.to_csv('./항목' + title + '.csv', encoding='utf-8-sig')
cs
반응형
Buy me a coffeeBuy me a coffee

댓글