python 다수의 txt 파일을 조건에 맞게 엑셀에 정리하는 코드에 문제가 있어 도움 부탁드립니다.



  • 안녕하세요.

    프로그래밍 전공자가 아니라 이제 입문한지 얼마 안된 초보라 현재 발생한 문제에 대해 어떤 식으로 대처를 해야 할지

    방법을 몰라 도움을 요청합니다…

    우선 현재 소스파일의 경우는 파일이 1분단위로 만들어져 있습니다.

    그래서 하루에 1440개 이고 한달치가 대략 43200개 정도 됩니다. 1년치면 518400개 정도 되는군요.

    하나의 txt 파일의 용량은 약 60kb 정도 이구요.

    1년치면 대략 30기가 정도 되는것 같습니다.

    현재 제가 하는 작업은 이 텍스트 파일을 불러와 조건에 만족할 경우 엑셀에 기록하여

    1년치 txt를 여러 엑셀 파일로 나눠서 기록하여 저장하는 것인데요.

    메모리 초과로 인해 1년치를 돌리지 못하고 있습니다.

    그래서 한달치라도 돌려보고자 했지만 pc에서 메모리 리소스를 작업하는 동안 확인 해보니

    메모리가 2기가가 되면 파이썬에선 에러코드가 나오면서 작업이 진행 되지 않았습니다.

    그래서 1달치 조차도 제대로 구동을 못하고 있습니다…

    적은 양의 txt를 돌릴 때는 문제 없이 돌아갔지만 양이 많아지니 계속해서 메모리에서 오류가 발생하네요…

    현재 제가 작성한 코드에서 메모리를 개선 하기 위해선 어떠한 방식을 취해야 할까요?

    close도 하고 gc도 정리 해줘도 도무지 답이 안나오네요…

    도움 부탁드립니다 ㅠㅠ…

    ps. 작성하고나서 보니 들여쓰기가 영 이상하게 들어가네요 ㅠㅠ…

    제가 이곳에 글을 처음 올리는 지라 어떤식으로 코드를 적어서 올려야 할지 몰라서 죄송합니다 ㅠㅠ…

    혹시 몰라 드랍박스에 제가 작업한 코드 링크를 올려두겠습니다.

    https://www.dropbox.com/sh/ziaoyp6jdvum5ro/AAA9o6dtv1FERqgtj89AY005a?dl=0

    도움 주시면 감사하겠습니다.

    # -*- coding: cp949 -*-
     
    import sys, os, time, subprocess, string
    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')))
    

답변을 위해 로그인하기