"예제로 배우는 파이썬 데이터 시각화"라는 책에서 파이썬에서 사용한 데이터를 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 =============================
'프로그래밍 > Python, R 프로그래밍' 카테고리의 다른 글
[Python] Python 19일차(예제로 배우는 파이썬 데이터 시각화) (0) | 2018.06.15 |
---|---|
[Python] Python 18일차 (0) | 2018.06.14 |
[Python] pandas에서 특정 문자열이 들어간 데이터를 제외하기 (0) | 2018.06.12 |
[Python] Python 17일차 (0) | 2018.06.12 |
[Python] Python 16일차(예제로 배우는 파이썬 데이터 시각화) (0) | 2018.06.11 |