[Python] 파일에서 필요한 데이터를 추출해 파일로 저장하기 #2

이전에 작성했던 코드를 다시 한번 수정했다. 별다른 것은 없고 퍼포먼스 체크를 위해 실행 시간을 출력하는 부분을 상점ID별로 정보를 출력하도록 수정했다.

# _*_ coding: utf-8 _*_

from multiprocessing import Process
import time
import datetime
import locale

seller = []
exclude = []
datas = []

def get_exce_time(start, end):
    return datetime.timedelta(seconds=(end - start))

def number_format(num, places=0):
    """Format a number according to locality and given places"""
    locale.setlocale(locale.LC_ALL, "")
    return locale.format("%.*f", (places, num), True)

def file_read():
    start = time.time()

    results = {}

    f = open('seller_id.txt', 'r', encoding="utf-8")
    lines = f.readlines()
    f.close()

    for line in lines:
        str = line.split("\t")
        id = str[4].strip()

        if id not in seller:
            seller.append(id)

    results['seller'] = seller

    f = open('exclude_item_id.txt', 'r', encoding="utf-8")
    lines = f.readlines()
    f.close()

    for line in lines:
        str = line.strip()

        if str not in exclude:
            exclude.append(str)

    results['exclude'] = exclude

    f = open('AllDataBasedOnDB.dat', 'r', encoding="utf-8")
    datas = f.readlines()
    f.close()

    results['datas'] = datas

    end = time.time()
    print("File Reading Time : {0}".format(get_exce_time(start, end)))

    return results

def find_item_code(data, process, idx, limit):
    seller = data['seller']
    exclude = data['exclude']
    datas = data['datas']

    for k, s_id in enumerate(seller):
        start = time.time()
        item = []

        if k % process != idx:
            continue

        for line in datas:
            if limit > 0 and len(item) == limit:
                break

            if line.find(s_id) == -1:
                continue

            str = line.split("\t")
            code = str[0].strip()

            if code not in exclude and code not in item:
                item.append(code)

        # txt 파일생성
        f = open('./out/' + s_id + '.txt', 'w')
        f.writelines(map(lambda x: x + "\n", item))
        f.close()

        end = time.time()
        print("{0} Process #{1} Running Time : {2} Count: {3}".format(s_id, idx, get_exce_time(start, end), number_format(len(item))))

if __name__ == '__main__':
    data = file_read()

    # 실행 프로세스 수
    process = 4

    # 추출한 레코드 수 0으로 설정하면 모든 레코드 추출
    limit = 0

    procs = [Process(target=find_item_code, args=((data, process, i, limit,))) for i in range(process)]
    for p in procs: p.start()

이젠 이 코드를 가지고 Class로 변경하는 걸 해보고 싶은데.. 언제가 될지는 아직 모르겠다.

편리

PHP와 MariaDB, jQuery 등을 사용해 게시판, 쇼핑몰 솔루션을 개발합니다. 그누보드5와 영카트5 개발에 참여 했습니다. Linux와 Nginx는 물론 WordPress, Git 등에도 관심이 많습니다. 자전거 타기 및 사진 촬영을 취미로 하고 있습니다.

카카오톡 플러스친구 채팅 : NCUBE.NET

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.