"예제로 배우는 파이썬 데이터 시각화"라는 책에서 파이썬에서 사용한 데이터를 csv, json, xlsx로 내보내는 프로그램이 있길래 '이건 자주 사용하겠다'라는 생각이 들어서 정리를 해놓는다.



============================= Python =============================

'''

* csv, json, xlsx에 데이터 내보내기

json, csv, xlsx와 같은 다양한 형식으로 데이터를 읽어오고, 내보내고, 작성하기 위해서

어떤 파이썬 모듈들을 어떻게 사용할지에 대한 내용이다.


import_file을 파라미터로 지정했고 그것을 export_format 형식으로 저장하게 된다.

'''



### 1. 필요한 모듈들을 가져온다.


import os

import sys

import argparse

from io import StringIO

import struct

import json

import csv



### 2. 데이터를 일고 쓰기에 적합한 함수들을 정의한다.


def import_data(import_file):

    '''

    import_file로부터 데이터 읽어오기

    fixed-width 행 찾기

    샘플 행: 161322597 038654351896 0042

    '''

    mask = '9s14s5s'

    data = []

    with open(import_file, 'r') as f:

        for line in f:

            # 라인은 튜플로 풀기

            fileds = struct.Struct(mask).unpack_from(line)


            # 각 필드의 공백 제거

            # 리스트에 모든 것을 담고 전체 데이터 셋에 추가

            data.append(list([f.strop() for f in fileds]))

    return data


def write_data(data, export_format):

    '''

    특정 변환을 위한 함수를 호출하고 데이터 셋을 반환한다.

    파일 안에 데이터를 저장해야만 하는 xlsx는 이로부터 예외이다.

    '''

    if export_format == 'csv':

        return write_csv(data)

    elif export_format == 'json':

        return write_csv(data)

    elif export_format == 'xlsx':

        return write_xlsx(data)

    else:

        raise Exception("Illegal format defined")



### 3. 각 데이터 형식을 별도의 구현으로 명시한다.


def write_csv(data):

    '''

    데이터를 csv로 변환하고, csv를 문자열로 반환한다.

    :param data: csv를 받았을 때 동작

    :return:  객체 내용 가져오기

    '''

    # 파일 입출력을 시뮬레이션한다.

    # csv는 파일에만 저장할 수 있다.

    f = StringIO.StringIO()

    writer = csv.writer(f)

    for row in data:

        writer.writerow(row)

    # 파일과 유사한 객체의 내용 가져오기

    return f.getvalue()


def write_json(data):

    '''

    데이터를 json으로 변환한다.

    :param data: json을 받았을 때 동작

    :return: json.dumps()로 반환

    '''

    j = json.dumps(data)

    return j


def write_xlsx(data):

    '''

    데이터를 xlsx 파일로 저장한다.

    '''

    from xlwt import Workbook

    book = Workbook()

    sheet1 = book.add_sheet("Sheet 1")

    row = 0

    for line in data:

        col = 0

        for datum in line:

            print(datum)

            sheet1.write(row, col, datum)

            col += 1

        row += 1

        # 여기서는 스프레드시트에 저장할 수 있는 열의 수 = hard limit을 65536으로 설정한다. 최대 65536행까지 사용한다는 뜻.

        if row > 65535:

            print('Hit limit of # of rows in one sheet (65535)', file=sys.stderr)

            '''

            import sys

            print >> sys.stderr, 'ddd'  # Python 2.7

            print('ddd', file = sys.stderr)  # Python 3

            '''

            break

    # XLS는 파일로 저장해야 하고 0을 반환하는 특별한 경우이다.

    f = StringIO.StringIO()

    book.save(f)

    return f.getvalue()



# 4. 명령행으로부터 인수로 파일명을 받아서 메인 코드의 엔트리 포인트로 보내준다.

#       받은 파일명을 파싱해서, 해당 데이터를 읽어오고, 요청된 포맷으로 데이터를 내보낸다.

if __name__ == '__main__':

    # 입력 인수를 파싱한다.

    parser = argparse.ArgumentParser()

    parser.add_argument("import_file", help="Path to a fixed-width data file.")

    parser.add_argument("export_format", help="Export format: json, csv, xlsx.")

    args = parser.parse_args()


    if args.import_file is None:

        print("You must specify path to import from.", file=sys.stderr)

        sys.exit(1)


    if args.export_format not in ('csv','json','xlsx'):

        print("You must provide valid export file format.", file=sys.stderr)

        sys.exit(1)


    # 지정된 경로가 액세스 가능한 파일인지를 확인한다.

    if not os.path.isfile(args.import_file):

        print("Given path is not a file: %s" %args.import_file, file=sys.stderr)


    # 서식화된 너비가 일정한 파일을 읽는다.

    data = import_data(args.import_file)


    # 데이터를 특정 포맷으로 저장한다.

    # 유닉스 계열의 pope-able을 만들기 위해 stdout으로 출력한다.

    print(write_data(data,args.export_format))

============================= Python =============================

+ Recent posts