중간 중간 함수 내용이 궁금하면

https://github.com/python-openxml/python-docx

여기로 들어가면 된다.




스타일 변경

글을 쓸 때 폰트 명, 폰트 크기등을 변경 시키고 싶을 것이다.

기본 설정 폰트를 변경하고 싶으면 document.styles['Normal'] 을 변경하면 된다.


1
2
3
style = document.styles['Normal']
style.font.name = '맑은 고딕'
tyle.font.size = Pt(8)
cs



* 한글폰트 변경


하지만 이 방식은 영문 폰트만 변경 되고 한글 폰트는 변경되지 않는다.

아쉽게도 한글 폰트 변경을 지정한 클래스가 없기 때문에 우리는 직접 설정해 줘야한다.


1
2
3
from docx.oxml.ns import qn, nsdecls
 
style._element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕'# 한글 폰트를 따로 설정해 준다
cs

이런 방법으로



* 스타일 생성


만약 새로운 스타일을 정의해 쓰고 싶다면


1
2
3
style_make = document.styles.add_style('banana', WD_STYLE_TYPE.CHARACTER)
 
document.add_paragraph("banana", style = style_make)
cs

이런 방법으로 사용하면 된다.




Head 지정 및 Head Style 변경

본문을 작성하면 제목을 써야 하고 제목으로 본문을 정리할 수 있다.

방식은 스타일을 새로 만드는 것과 비슷하다. 하지만 Head는 기본 정의된 Heading1~9를 바탕으로 지정 가능하다.

Heading은 1부터 9까지 순차적으로 대 분류에서 소 분류로 정의 되어 있다.


1
2
3
4
5
6
7
8
style_1 = document.styles.add_style('Heading_1', WD_STYLE_TYPE.PARAGRAPH)
style_1.base_style = document.styles['Heading 1']
style_1.font.name = '맑은 고딕'
style_1._element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕'# 한글 폰트를 따로 설정해 준다
style_1.font.size = Pt(14)
style_1.font.color.rgb = RGBColor(0x000x000x00)
 
document.add_paragraph("banana" , style='Heading_1')
cs

*폰트 색상은 RGB 16진수로 입력하면 원하는 색상이 된다.

중간 중간 함수 내용이 궁금하면

https://github.com/python-openxml/python-docx

여기로 들어가면 된다.



표 만들기(add_table())

표를 만들기 위해 우선 add_table함수를 통해 행렬의 갯수를 입력한다.

표 스타일은 기본인 'Table Grid'로 뒀다.

이후 셀에 가운데 정렬로 알파벳을 순서대로 입력한 예제이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
from docx import Document
 
document = Document()
 
table = document.add_table(rows = 1, cols = 4)
table.style = document.styles['Table Grid']
 
hdr_cells = table.rows[0].cells
hdr_cells[0].paragraphs[0].add_run('A').bold = True
hdr_cells[0].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER  #가운데 정렬
hdr_cells[1].paragraphs[0].add_run('B').bold = True
hdr_cells[1].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
hdr_cells[2].paragraphs[0].add_run('C').bold = True
hdr_cells[2].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
cs




셀 크기 조절하기(cells[0].width)

만든 표의 셀 크기도 조절 가능하다.


1
hdr_cells[0].width = Cm(2.9)
hdr_cells[0].height = Cm(2.9)
cs





셀 추가하기(table.add_row())

표를 만든 후 추가적으로 셀을 삽입 할 때 사용

셀을 추가한 후에는 테이블 사용과 동일하다.


1
2
3
4
5
6
7
row_cells = table.add_row().cells
row_cells[0].paragraphs[0].add_run('A').bold = True
row_cells[0].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
row_cells[1].paragraphs[0].add_run('B').bold = True 
row_cells[1].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
row_cells[2].paragraphs[0].add_run('C').bold = True 
row_cells[2].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
cs





셀 배경색 넣기

셀에 배경색을 넣는 함수는 따로 없기 때문에 직접 xml을 건드려 바꿔준다.

w:fill="BFBFBF" 에서 원하는 색상을 RGB값 16진수로 입력하면 된다.

table.rows[0].cells[0] 자리에 원하는 셀을 입력하면 된다. 


1
2
3
4
from docx.oxml import parse_xml

shading_elm = parse_xml(r'<w:shd {} w:fill="BFBFBF"/>'.format(nsdecls('w'))) #음영
table.rows[0].cells[0]._tc.get_or_add_tcPr().append(shading_elm)
cs





셀 병합(merge())

표 제작의 마지막으로 병합을 해보자 

병합은 두 셀 값을 받아 사각형 모양으로 병합이 된다.


1
2
3
t_sum_a = table.cell(10)
t_sum_b = table.cell(20)
t_sum_a.merge(t_sum_b)
cs



다음 글에선 스타일 변경 및 생성에 대해 포스팅 하겠다.



중간 중간 함수 내용이 궁금하면

https://github.com/python-openxml/python-docx

여기로 들어가면 된다.




python-docx를 사용하기에 앞서 Document() 함수를 변수에 입력해 준다.


1
2
3
from docx import Document
 
document = Document()
cs




add_paragraphs()


본문은 add_paragraphs()함수를 이용해 입력해 준다.

* 이후 같은 paragraphs에 입력을 원할경우 add_run() 함수를 사용한다.


1
2
3
4
5
6
from docx import Document
 
document = Document()
 
document.add_paragraph("본문")
document.add_paragraph.add_run('추가 본문')
cs




굵게, 기울임 (.bold / .italic)

본문을 굵게 만들고 싶다면 .bold 와 .italic 을 사용하면된다.


1
2
3
4
5
6
from docx import Document
 
document = Document()
 
document.add_paragraph("본문").bold = True
document.paragraphs[-1].add_run('BOLD \n').italic = True
cs





중앙 정렬 (WD_ALIGN_PARAGRAPH.CENTER)

중앙 정렬을 하기 위해선 WD_ALIGN_PARAGRAPH 을 import 해 줘야 한다.

그리고 이전 paragraph을 지정해 중앙 정렬해 주면 된다.


1
2
3
4
5
6
7
8
9
10
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
 
document = Document()
 
document.add_paragraph("본문").bold = True
document.paragraphs[-1].add_run('BOLD \n').italic = True
 
last_paragraph = document.paragraphs[-1
last_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
cs





이미지 삽입 (add_pcture())

이미지를 삽입 할 때 가로 길이와 세로길이를 지정해 불러올 수 있다.

width()는 가로 길이, height는 세로 길이를 지정한다.


1
2
3
4
5
6
7
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Cm, Inches
 
document = Document()
 
document.add_picture(Text_image_name,width= Cm(4.91), height= Cm(8))
cs

*길이의 경우 CM이외에도 인치(Inches) 등의 단위도 사용 가능 하다.




저장하기 (save())

마지막으로 작성한 워드 파일을 저장하는 함수이다.

함수 안에 원하는 파일 명을 입력하면 끝


1
2
3
4
5
from docx import Document
 
document = Document()
 
document.save('make.docx')
cs


파싱한 데이터를 그냥두면 파싱한 이유가 없다.

그래서 파싱한 데이터를 문서화 시키려고 하는데

이 또한 자료가 부족했다.


그래서 부족한 정보이지만 나누고자 글을 쓴다.






Python-docx


Python-docx : 파이썬을 이용해 워드 문서를 작성할 수 있게 만든 모듈




Python-docx 다운 방법


이전 문서인 pyparsing을 다운 받는 방법과 동일하다.

간단하다 pip을 이용해 아래와 같이 입력해 다운받으면 된다.

아나콘다를 사용하지 않는다면 윈도우에서 pip 다운로드 사용방법을 검색해 보자


pip install python-docx


이후 코드에 docx을 import 해 모듈을 사용하면 된다.


1
import docx
cs


Pyparsing에는 기본적인 함수들 이외에 많은 함수들이 있다.

활용하면 더 다양한 구문들을 파싱할 수 있다.

그 중 몇가지 함수를 설명 하겠다.




White()


'\n', space 바 등 공백을 파싱하고 싶을 때 사용한다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pyparsing import Word, alphas, nums, White
text = '''
if(banana() == 0)
{
    apple()
}
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = White() + ident("func")
 
for fn,s,e in parsing.scanString(text):
    print(fn.func)
cs


결과

if
apple





LineStart()


만약 줄 바뀌자마자 바로 오는 단어만 파싱하고 싶을 때 사용 한다.


예제 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pyparsing import Word, alphas, nums, White, LineStart
text = '''
if(banana() == 0)
{
    apple()
}
Orange()
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = LineStart() + ident("func")
 
for fn,s,e in parsing.scanString(text):
    print(fn.func)
cs

결과

if
Orange





Optional()


파싱 하고 싶은 구문의 구성 요소가 가변적일때 사용하면 된다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pyparsing import Word, alphas, nums, White, LineStart
text = '''
banana is sweet
apple is very sweet
carrot is bitter
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = ident("name"+ Keyword("is"+ Optional("very"+ ident("taste")
 
for fn,s,e in parsing.scanString(text):
    print(fn.name, " : ", fn.taste)
cs


결과

banana  :  sweet
apple  :  sweet
carrot  :  bitter





SkipTo()


원하는 단어 이전의 문자열 까지 스킵한다. 말은 스킵이지만 지나치는건 아니고 원하는 단어나 구문이 나오기 전까지의 문자열을 하나의 리스트에 저장한다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pyparsing import Word, alphas, nums, SkipTo, Keyword
text = '''
if(banana is sweet)
{
    apple is very sweet
    carrot is bitter
}
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = Keyword("if"+ "("+ SkipTo("carrot"+ ident("name"+ Keyword("is")  + Optional("very"+ ident("taste")
 
for fn,s,e in parsing.scanString(text):
    print(fn.name, " : ", fn.taste)
cs


결과

carrot : bitter



* text의 밑줄 친 부분이 SkipTo()함수로 파싱되었다.

1
2
3
4
5
6
7
8
9
10
 '''
if(banana is sweet)
{
    apple is very sweet
    carrot is bitter
}
'''
 
cs





ignore()


파싱 하지 않을 요소를 정의해 파싱하지 않고 무시한다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pyparsing import Word, alphas, nums, White, LineStart
text = '''
banana is sweet
apple is very sweet // apple is very delicious
carrot is bitter
'''
 
ident = Word(alphas + "_")
ident_2 = Word(nums)
 
parsing = ident("name"+ Keyword("is"+ Optional("very"+ ident("taste")
parsing.ignore("//" + SkipTo("\n"))
 
for fn,s,e in parsing.scanString(text):
    print(fn.name, " : ", fn.taste)
cs


결과

banana : sweet apple : sweet carrot : bitter


Pyparsing 모듈코드는 Git-hub에 올려져 있으니 궁금한 사항은 찾아보면 된다.

https://github.com/pyparsing/pyparsing/blob/master/pyparsing.py

그 중 내가 사용한 함수들을 설명해 보고자 한다.



word()


word 함수로 원하는 단어를 파싱 할 수 있다.

여기서 alphanums는 알파벳 + 숫자를 의미한다. 만약 다르게 사용하고 싶으면 아래 코드를 참조 하자

1
2
3
4
5
6
from pyparsing import Word
 
ident = Word(alphanums)  # 알파벳 + 숫자
ident_2 = Word(alphas)  # 알파벳 + 숫자
ident_3 = Word(nums)     # Only 숫자
ident_4 = Word(alphanums + '_'# '_' 도 포함
cs



예제

1
2
3
4
5
6
7
8
9
10
11
12
from pyparsing import Word, alphas, nums
text = '''
I have 2 apples and 1 banana
'''
 
ident = Word(alphas)
ident_2 = Word(nums)
 
parsing = ident_2("number"+ ident("fruit")
 
for fn,s,e in parsing.scanString(text):
    print('fruit :', fn.fruit, ' number : ', fn.number )
cs

결과

fruit : apples  number :  2
fruit : banana  number :  1



* PyParsing 코드에 정의된 부분을 보면 좀 더 이해가 잘될거다.

1
2
3
4
5
6
7
8
# PyParsing 코드 일부
 
alphas     = string.ascii_uppercase + string.ascii_lowercase
nums       = "0123456789"
hexnums    = nums + "ABCDEFabcdef"
alphanums  = alphas + nums
_bslash    = chr(92)
printables = "".join(c for c in string.printable if c not in string.whitespace)
cs





Keyword()


word를 이용해 원하는 자료형을 파싱할 수 있다면 KetWord는 특정 단어를 파싱하는 방법이다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pyparsing import Word, Keyword, alphanums
 
text = '''
#define prototype.h
int a = 0
if(a == 1):
    print("done")
'''
 
ident = Word(alphanums + "." + "_")
parsing = Keyword("#define"+ ident("name")
 
for fn,s,e in parsing.scanString(text):
    print(fn.name)
cs


결과

prototype.h





응용


만약 2개 이상의 특정 단어를 파싱하고 싶다면 Keyword로는 범용적으로 파싱이 불가능 하다.

이럴때는 Word를 이용하면 쉽게 파싱이 가능하다.


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pyparsing import Word, Keyword, alphanums
 
text = '''
I have many fruit
banana = 3
carrot = 1
apple = 2
tomaoto = 5
'''
 
ident = Word(alphanums)
fruit = Word("banana" + "apple")
parsing = fruit("name"+ "=" + ident("num")
 
for fn,s,e in parsing.scanString(text):
    print(fn.name, "->", fn.num)
cs

결과

banana -> 3
apple -> 2


간단하게 c코드를 파싱할 일이 생겼다. 

파이썬을 이용해 파싱을 해보고자 파이썬 파싱을 검색을 했다. 


웹 크롤링 관련 글만 보였다. 

웹 크롤링을 응용하기엔 내가 무지하였다.


PyParsing이란 모듈을 발견 하였다. 

하지만 PyParsing을 설명해주는 한글 블로그는 없었고 나는 영어를 못했다.


그래서 이후 c코드를 파싱 하고 싶어하는 사람들을 위해 간단하게 한글 사용법을 남기려 한다.




파싱(Parsing) 이란?


파싱(Parsing) : 일련의 문자열을 분석, 분해하여 원하는 형태로 재 구성한 것.





PyParsing


Pyparsing : 간단한 파이썬 파싱 모듈. 




PyParsing 다운 방법


파싱을 하기에 앞서 필요한 모듈 PyParsing을 다운 받아보자  

간단하다 pip을 이용해 아래와 같이 입력해 다운받으면 된다.

아나콘다를 사용하지 않는다면 윈도우에서 pip 다운로드 사용방법을 검색해 보자


pip install pyparsing


이후 코드에 pyparsing을 import 해 모듈을 사용하면 된다.


1
import pyparsing
cs


+ Recent posts