파이썬의 bs4 그리고 requests를 활용해서 크롤링을 할 때에, 한글 인코딩 문제로 아래와 같은 에러가 발생할 수 있다.



본인은 conda 가상 환경에서 python 3.6 버전을 이용해서 cgv의 상영 시간표를 크롤링하다가 이러한 에러를 만났다.



UnicodeEncodeError: 'cp949' codec can't encode character '\xa0' in position 162673: illegal multibyte sequence



인코딩과 관련된 문제는 대부분 한글과 관련해서 발생하는 문제이다.



코드 상단에 아래와 같은 코드를 추가해주면 해결할 수 있다.


1
2
3
4
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#implementation of simple GUI program
from tkinter import *
 
def printHello():
    print('Hi!')
 
#root = tkinter.TK()
window=Tk()
w=Label(window, text = "Python Test")
b=Button(window, text = "Hello Python", command = printHello) #if clicked, run printHello function
c=Button(window, text = "Quit", command = window.quit) #if clicked, quit
 
w.pack()
b.pack()
c.pack()
 
window.mainloop()
 
cs

python test라는 버튼을 누르면 콘솔창에 hi를 출력하고, quit을 누르면 종료하는 기본적인 GUI 프로그램 구현 코드이다

기본적인 데이터 타입과 자료형에 관해서 간략히 정리하고자 한다.


정말 기본적인 특성도 이 글에서 함께 정리하려고 한다.




1. 먼저 변수란 데이터를 참조하기 위해 메모리 주소를 대신하는 별명 정도로 이해하면 된다.



2.python에서는 문자와 문자열을 구분하지 않는다. str 형으로 통합되어 있다.



3. 정수를 사용할 경우, c++에서는 int형은 약 +-21억 정도 사용할 수 있었던 것으로 기억하는데


파이썬의 경우 메모리가 허용하는만큼 수를 크게 사용할 수 있다.




4. 하지만 실수의 경우에는 8바이트 선에서 표현된다.



5. 형변환을 할 때에는 int(str형) 과 같은 방식으로 한다.



6. C++에서 처럼 나눗셈 연산을 할 때 기본적으로 버림을 하지 않는다. 몫만 구하는 연산자가 // 로 정의되어 있다.



7. .format을 활용한 출력은 아래 코드에 정리되어 있다.


1
2
3
dic = {1:"a"2"b"3"C"}
for i in dic:
    print('{0}value : {1}'.format(i, dic[i]))
cs

이런식으로 쓰기도 가능



8. else if를 의미하는 것이 elif



9. range(0, 10, 1) 0부터 시작해서 10보다 작을동안 1씩 증가하면서




아래로는 컨테이너 자료형에 대한 정리이다.



1. 튜플은 리스트와 비슷하다. 차이점은 튜플은 데이터를 수정할 수 없다는 것이다.


길이를 구하고, 튜플끼리 결합하고, 슬라이싱, 인덱스를 활용한 접근, 특정 데이터가 몇 개 있는지 확인 등은 모두 가능하다



2. 딕셔너리: {}로 표현되고, key value 페어로 데이터가 관리된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
str = "123"
num = 456
str2 = int(str#문자를 숫자로 변환
print(str2 + num)
 
myList = ['abc'123, True, 3.14"A"]
print(len(myList)) #길이를 확인
 
myList.append('newData')
print(myList)
myList.append('newData'#중복도 가능
print(myList)
 
myList.pop() #가장 마지막 데이터 pop된다
print(myList)
 
myList.pop(0#인덱스가 0인 데이터 삭제
print(myList)
 
#list에 다른 list를 이어 붙이고 싶은 경우
myList.extend(['n1''n2'])
print(myList)
 
#특정 위치에 인덱스 삽입
myList.insert(3'insterted')
print(myList)
 
#특정 원소 삭제
myList.remove('A')
print(myList)
 
#전체 삭제할 때는
myList.clear()
print(myList)
 
#정렬하고 싶다. 이 때 숫자와 문자가 섞여있으면 정렬할 수 없다.
nlist = [1423]
nlist.sort(reverse = True) #이러면 내림차순. default는 false로 내림차순
print(nlist)
 
#역순으로 뒤집고 싶다
nlist = [1423]
nlist.reverse()
print(nlist)
 
#슬라이싱 slicing
#시작점~ 마지막값 인덱스 +1
sliced = nlist[1:2#맨앞에 생략되면 처음부터
print(sliced)
 
#튜플 : 리스트랑 비슷한데, 소괄호를 이용하고 데이터의 수정이 불가능
 
#dictionary
dic = {'1'"as"'3'"adad"'4'"akkkkk"}
del dic['1']
print(dic)
 
print('A' < 'a'#소문자의 아스키 값이 더 크다
 
 
# dictionary 출력
 
for i in dic:
    print(i)
    print(dic[i])
 
dic = {1:"a"2"b"3"C"}
for i in dic:
    print('{0}value : {1}'.format(i, dic[i]))
 
for i in range(2101):
    print(i, "단")
    for j in range(1101):
        print('{0} X {1} = {2}'.format(i, j, i*j))
 
for i in range(10):
    print(i)
 
 
cs


+ Recent posts