1. .dbf 확장자 .csv로 변환

- .dbf 파일은 데이터베이스 회사인 디베이스에서 개발한 확장자로 1983년 dBASE II 가 도입되면서 사용되었음

- 때문에 아직도 오래된 소프트 웨어나, 디베이스를 기반으로 하는 소프트웨어는 .dbf 로 파일을 output 하며, 디베이스가 없다면 파일을 읽고 수정하기가 굉장히 번거로움

- 엑셀의 경우도 dbf 파일을 읽을 수 있으나, 자동측정장치와 같은 하드웨어로 대량의 데이터를 장기간 수집했을 경우, 수작업을 통하여 엑셀파일로 접근하는게 어렵기 때문에, 보다 쉽게 .dbf 파일을 .csv 파일로 변환할 수 있어야함

 

 

code---------------------------------------------------------------------------------

# 패키지 임포트

import csv 
from dbfpy import dbf 
import os 
import sys





csv_fn = "all.csv"

with open(csv_fn,'wb') as csvfile:

    for file_name in os.listdir('.'):

        if file_name.lower().endswith('.dbf'):

            print ("Converting %s to csv" % file_name)



            in_db = dbf.Dbf(file_name)

            out_csv = csv.writer(csvfile)





            for rec in in_db:

                out_csv.writerow(rec.fieldData)

   

            in_db.close()

            print ("Done...")

   

        else:

            print ("Filename does not end with .dbf")

 

 

figure 1. 코드 설명

 

- 위 코드의 구조는 .dbf 파일을 읽은 후, 빈 csv 파일에 내용을 붙여넣어 새롭게 생성하는 구조임

(convert가 아닌 새로운 시트에 복사 생성)

 

- 패키지 모듈 중 dbf 파일을 읽을 수 있는 패키지 dbf는 파이썬 2.x 버전에서만 사용가능함! 반드시 가상환경 사용

- (아나콘다를 통한 가상환경 명령어 사용 참고 https://imlanktonlifelab.tistory.com/11)

 

 

- 변환은 os 모듈의 디렉토리에서 진행되며, 생성 csv 파일 또한 디렉토리 내에 생성됨

- 디렉토리 변경 코드는 아래

 

code--------------------------------

os.chdir('C:/Projects/dbf2csv/')

-------------------------------------

 

- 'C:/Projects/dbf2csv/' 대신 디렉토리 붙여넣기

 

 

대회를 마친 kaggle competition 중 이진 이미지 분류 대회인 Statoil/C-CORE Iceberg Classifier Challenge 의 데이터와 Notebook을 분석하고 필사하며 공부하는 중, 생각보다 빠르게 첫 번째 장애물에 부딪혔다.

 

바로, 캐글 Kernel 상 작업을 위해서는 *.json 파일을 읽어야하는데, 주어진 데이터셋은 *.7z로 되어있는게 아닌가!

심지어 kernel 상에서는 *.7z의 압축을 해제할 수도 없는 상황.

 

캐글코리아의 운영진이자, 캐글 마스터이신 유한님의 강의를 살펴봐도 아쉽게 이 부분에 대한 내용은 찾을 수 없었다. (꿀팁이 난무하는 엄청난 강의...ㄷㄷ 꼭 한 번쯤 들으시길)

 

(잘 알지는 못하지만, 아마도 끝난 competition의 경우, 데이터셋의 제공을 압축파일 형태로 바꿔 제공하면서 생긴 문제가 아닌가 싶다. 위 competition의 유한님 youtube 링크는 아래 참조)

 

유한님의 강의 참조 : (https://www.youtube.com/watch?v=lDnTS3h8HRk)

 

문제를 해결하고자 캐글상에 같은 문제를 겪고 있는 사람이 있는가 싶어, 검색한 결과 캐글의 운영팀에서 답변한 자료가 존재함을 알 수 있었다.

다음의 코드와 해결책은 아래 링크에서 답변된 캐글팀의 Paul Mooney의 해결책을 컴퍼티션에 맞게 수정한 것이다.

혹시나 유한님 강의를 따라가면서 필자와 같은 문제를 겪는분들에게 도움이 되길!

 

참조 : (https://www.kaggle.com/general/129520#752512)

 

Accessing files under *.7z archive files | Data Science and Machine Learning

Events and topics specific to our community | Kaggle Forum

www.kaggle.com

 

CODE=========================================================

 

!pip install pyunpack
!pip install patool

os.system('apt-get install p7zip')

 

import os
from pyunpack import Archive
import shutil

 

if not os.path.exists('/kaggle/train/') :
    os.makedirs('/kaggle/train/')

Archive('/kaggle/input/statoil-iceberg-classifier-challenge/train.json.7z').extractall('/kaggle/train/')

if not os.path.exists('/kaggle/test/') :
    os.makedirs('/kaggle/test/')

Archive('/kaggle/input/statoil-iceberg-classifier-challenge/test.json.7z').extractall('/kaggle/test/')

for dirname, _, filenames in os.walk('/kaggle/'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

 

 

train = pd.read_json('../train/data/processed/train.json')
test = pd.read_json('../test/data/processed/test.json')

===============================================================

 

코드는 Archive 라는 라이브러리를 통해 *.7z 파일을 다른폴더로 추출하는 과정을 보여준다. 다른폴더가 중요하다.

코드를 실험해본 결과, 기존폴더와 다른폴더를 새로 만들어서 만들어진 폴더로 추출하지 않는다면, 이상하게 Unpack 되지 않는다는 오류가 발생한다. (왜 이런건지 설명 가능하신분 댓글로..)

 

이에 필자는 기존 input 또는 working 폴더 대신에 train, test 라는 폴더를 새로 생성하여, 그 안에 추출하여

작업을하도록 하였다.

 

이만, Keep going!

'프로그래밍 > 기타' 카테고리의 다른 글

[dbf to csv] .dbf 확장자 .csv 변환  (1) 2020.06.23

+ Recent posts