# -*- coding: cp949 -*-
import sys, os, time
import openpyxl
from os import listdir
from os.path import isfile, join
import os, glob
import pdb
import gc
#pdb.set_trace()
def filerun(textpath,rownum):
f = open(textpath, 'r+',)
row_list = []
colnum = 1
for row in f :
row_list.append(row.split('#'))
for col in row_list:
for n in range(0, pNum):
if col[0] == pList[n]:
colnum = colnum + 1
for i in range(len(title)):
l = [2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15]
for ip in l:
if i == ip:
savews = savewb[i].active
savews.cell(row=(rownum), column= (colnum) ).value = col[i]
savews.cell(row=(rownum), column= 1 ).value = col[1]
f.close()
#print log
now = time.localtime()
print '[' + str(now.tm_year) + '/' + str(now.tm_mon) + '/' + str(now.tm_mday) + ' ' + str(now.tm_hour) + ':' + str(now.tm_min) + ':' + str(now.tm_sec) + '] Start Process'
pNum = int(raw_input('Enter the number of station : '))
print 'Enter the station number : '
tmpString = raw_input()
pList = tmpString.split(' ')
title = ['code', 'ymdhm', 'latitude', 'longitude', 'height ', 'WD1(x10)', 'WS1(x10)', 'Temp(x10)', 'humidity(x10)', 'noname1', 'seaLpress(x10)', 'precOX(x10)', 'noname2', 'DPrec(x10)', 'Prec15(x10)', 'Prec60(x10)', 'noname3', 'noname4', 'noname5']
savewb = list()
count = list()
for i in range(0, len(title)):
count.append(list())
count[i] = 1
savewb.append(list())
savewb[i] = openpyxl.Workbook()
#Get root directory path
sourcepath = raw_input('Root path : ')
#Set save directory path
savepath = raw_input('save path : ')
if not os.path.exists(savepath):
os.makedirs(savepath)
#Get directory's file list
for i in range(0, len(title)):
rcount = 1
savews = savewb[i].active
for jijum in pList :
savews.cell(row=1, column= rcount + 1).value = jijum
rcount = rcount + 1
years = listdir(sourcepath)
for y in years :
ypath = os.path.join(sourcepath, y)
months = listdir(ypath)
rownum1 = 2
for m in months :
ympath = os.path.join(ypath, m)
days = listdir(ympath)
for d in days :
ymdpath = os.path.join(ympath, d)
textfiles = [ join(ymdpath,f) for f in listdir(ymdpath) if isfile(join(ymdpath,f)) and '.txt' in f]
for textfile in textfiles:
filerun(textfile, rownum1)
rownum1 = rownum1 + 1
gc.collect()
for i in range(len(title)):
l = [2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15]
for ip in l:
if i == ip:
savewb[i].save(os.path.join(savepath, (str(title[i]) + '.xlsx')))
위와 같이 만들어진 코드이고 어떤 코드인지 설명 드리면
txt 파일 안에 있는 데이터가
12#201105010000#36.5333#126.3167#45.70#0#0#125#956#10002#10056#0#0#600#0#0#0#0#=
이런 형식으로 약 몇백 줄 정도 있는 파일이 있습니다.
그래서 # 으로 split 한 다음에
가장 앞에 위치한 숫자가 타겟인데요
제가 설정한 숫자가 맞을 경우 엑셀에 기록을 하여 저장을 하는 형태입니다.
그런데 돌려야할 txt 파일이 한 20기가 정도가 되는데요
MemoryError 가 뜨고
작업관리자에서 메모리 리소스를 보면 python은 2기가를 꽉 채워서 돌다가 결국 에러가 나더라구요 ㅠㅠ
적은 파일은 돌리면 이상없이 돌아가고 결과도 잘 생성되는데
한번에 다 할려고 하면 저렇게 오류가 발생 해버리는데 어떻게 처리를 해줘야 될까요 ㅠㅠ...
파일도 계속해서 close 하고 가비지콜렉터도 비워주는데
어떻게 해야 할지...
프로그래밍 고수님의 도움이 필요합니다 ㅠㅠ