본문 바로가기
Programming/Python

[python] 파이썬 정규표현식 - 파일 읽기, 저장

by NAMP 2016. 3. 4.

파이썬 정규표현식 - 파일 읽기, 저장

파일을 읽어서 특정 문자열을 찾고 텍스트 파일을 저장하는 프로그램을 작성합니다.

정규표현식을 사용하기 위하여 re를 import 합니다.
파일 목록을 얻기 위하여 os를 import 합니다.

import re
import os

찾을 문자열은 URL에서 사용하는 파라미터의 키와 값 입니다.
? 뒤에 오면서, &로 구분되고, 키와 값은 =으로 구분됩니다. 마지막에 ,가 오는 문자열이라서 해당 내용을 추가하였습니다.

p = re.compile('([^&?]+)=([^&,]+)')

찾을 키 목록을 리스트로 생성합니다. 그리고 결과를 담을 리스트 변수를 생성합니다.

keys = ['fi', 'to', 'cb', 'do', 'fl', 'ho', 'si', 'te']
rst = []
for idx, item in enumerate(keys):
    rst.append("")

os.listdir(경로)를 통하여 특정 경로의 파일을 얻습니다. 파일을 저장할 경로도 설정합니다.

srcPath = os.getcwd() + "\\org\\"
destPath = os.getcwd() + "\\csv\\"
files = os.listdir(srcPath)

패턴의 p.findall(line)을 사용하여 모든 내용을 검색하면서 반복처리 합니다. 해당 결과는 튜블로 전달되므로, 각각 tup[0], tup[1], ... 인덱스를 통하여 접근할 수 있습니다.

for tup in p.findall(line):
	key = tup[0]
    val = tup[1]

찾을 내용을 리스트로 생성하여 반복처리합니다. 리스트는 enumerate를 통하여 각각의 인덱스와 값을 얻을 수 있습니다.

for idx, item in enumerate(keys):   

각각의 파일을 줄단위로 내용을 읽어서 원하는 문자열을 찾습니다. 리스트를 CSV 문자열로 변환하여 파일을 저장합니다.

for file in files:
    fr = open(srcPath + file,'r')
    fw = open(destPath + file + ".csv", 'w')
    lines = fr.readlines()
    # 줄단위
    for line in lines:
	    # 검색단위
        for tup in p.findall(line):
            key = tup[0]
            val = tup[1]
            for idx, item in enumerate(keys):
                if key == item:
                    rst[idx] = val
        contents = ",".join(rst) + "\n"
        print(contents, end="")
        fw.write(contents)
    fr.close()
    fw.close()

전체 소스

import re
import os

p = re.compile('([^&?]+)=([^&,]+)')

srcPath = os.getcwd() + "\\org\\"
destPath = os.getcwd() + "\\csv\\"

files = os.listdir(srcPath)

keys = ['fi', 'to', 'cb', 'do', 'fl', 'ho', 'si', 'te']
rst = []
for idx, item in enumerate(keys):
    rst.append("")

# 파일단위
for file in files:
    fr = open(srcPath + file,'r')
    fw = open(destPath + file + ".csv", 'w')
    lines = fr.readlines()
    # 줄단위
    for line in lines:
        for idx, item in enumerate(keys):
            rst[idx] = ""

        # 검색단위
        for tup in p.findall(line):
            key = tup[0]
            val = tup[1]
            for idx, item in enumerate(keys):
                if key == item:
                    rst[idx] = val

        contents = ",".join(rst) + "\n"
        print(contents, end="")
        fw.write(contents)

    fr.close()
    fw.close()

참고


댓글