본문 바로가기

전체 글

TypeError: can't subtract offset-naive and offset-aware datetimes 말 그대로 시간대가 설정되지 않은 datetime객체와 시간대가 설정된 datetime객체간에 뺄셈 연산을 할 수 없다는 뜻이다. 예를 들면 아래와 같다. from datetime import datetime as dt, timezone as tz # offset-naive d1 = dt(2022, 11, 22) # offset-aware d2 = dt(2022, 11, 21, tzinfo=tz.utc) print(d1-d2) 따라서 둘 다 시간대를 갖도록 해주거나, 둘 다 시간대를 없애면 연산이 가능하다. from datetime import datetime as dt, timezone as tz # offset-naive d1 = dt(2022, 11, 22) # offset-aware d2 = dt.. 더보기
파이썬으로 네이버 웹툰을 압축해보자 지난번엔 네이버 웹툰을 다운로드 하는 과정을 경험해봤다. 파이썬으로 네이버 웹툰을 다운로드 받아보자 오늘은 네이버 웹툰을 다운로드 해볼 예정이다. 네이버 웹툰은 처음 응답받는 HTML에 모든 이미지 src가 들어있기 때문에 굉장히 쉽게 다운로드 받을 수 있다. 시험대에 오를 작품은 호랑이형님 1 f-three.tistory.com 이번엔 파일 하나하나를 파일로 만들지 않고, 바로 압축파일로 저장해보도록 하겠다. 파이썬에서는 압축하는 기능을 ZipFile이라는 클래스를 통해서 제공한다. 간단하게 사용법을 보면 아래와 같다. from zipfile import ZipFile with ZipFile('test.zip', 'w') as zf: file_name = 'test.txt' zf.write(file_n.. 더보기
유니코드 정규화 문제 (NFC, NFD) db에 있는 텍스트를 파일로 저장하는 기능을 개발했다. 그런데 파일의 텍스트가 자모음 분리가 되는 것 아닌가. 이유는 유니코드 정규화와 관련된 문제였다. 해결방법부터 보자면 아래와 같다. import unicodedata text = '...' nfc_text = unicodedata.normalize('NFC', text) 이렇게 NFC 정규화를 해준 후 저장하면 문제가 없다. 그럼 유니코드 정규화란 뭔지 보겠다. 우선 유니코드는 세상의 모든 문자에 대해 숫자를 대응시키는 규격이라고 보면 된다. python에서는 ord함수로 간단히 유니코드를 확인할 수 있다. text = '가' unicode = ord(text) #44032 보시다시피 '가' 라는 글자에 숫자가 배정돼있다. 그럼 'ㄱ' 과 'ㅏ'는 .. 더보기
파이썬으로 네이버 웹툰을 다운로드 받아보자 오늘은 네이버 웹툰을 다운로드 해볼 예정이다. 네이버 웹툰은 처음 응답받는 HTML에 모든 이미지 src가 들어있기 때문에 굉장히 쉽게 다운로드 받을 수 있다. 시험대에 오를 작품은 호랑이형님 1화이다. 우선 브라우저의 개발자도구로 이미지가 위치한 태그를 찾아보았다. CSS선택자로는 #comic_view_area > .wt_viewer > img 가 이미지 목록임을 쉽게 얻어낼 수 있었다. 그렇다면 작업계획은 아래와 같이 세울 수 있을것이다. 1. 이미지 목록 얻어내기 2. 각 src에 해당하는 URL로 요청을 보내기 3. 응답받은 데이터를 파일로 저장하기 여기에 추가적으로 이미지파일에 요청을 보낼 때, header 설정이 필요하다. 반드시 아래와 같을 필요는 없고 브라우저에서 요청을 보낸 것 처럼 Us.. 더보기
[python] generator는 일회용? (map, filter와 같은 함수를 쓸 때 생기는 문제) 아래 코드는 어떤 문제가 생길까 data = [1, 2, 3] double_data = map(lambda x: 2*x, data) min_value = min(double_data) max_value = max(double_data) double_data가 빈 리스트란다 ValueError: max() arg is an empty sequence 이와 같은 실수는 map, filter와 같이 generator함수를 사용하는 경우에 발생할 수 있다. generator는 단방향이다. 현재 계산되는 값만 내보내주기 때문에 인덱스로 참조도 불가능하다. 따라서 한 번 순회하고 나면 더 이상 값을 얻어낼 수 없다. 따라서 재사용이 필요하다면 list와 같은 자료구조 형태로 메모리에 저장해두도록 하자. data =.. 더보기
TypeError: Object of type datetime is not JSON serializable python의 json.dumps를 사용하다가 만나게 되는 에러다. json.dumps는 내부에서 JSONEncoder를 사용해서 직렬화를 하는데 해당 라이브러리에서 지원하는 타입이 아니면 에러를 발생시키기 때문인다. 가장 간단한 해결방법으로는 아래와 같이 코딩하는 방법이 있다. json.dumps(dict_obj, default=str) 자 이제 에러가 나지 않는다. 그런데 우리가 원한 형태의 직렬화가 맞는가? 만약 아니라면 해결방법을 찾아보자. 일단 JSONEncoder는 아래와 같은 타입만 기본적으로 변환해준다. class JSONEncoder(object): """Extensible JSON encoder for Python data structures. Supports the following .. 더보기
json.dumps 한글 json형태의 데이터를 스트링을 변환하기 위해 사용하는 함수인데, 한글이 들어가면 이상하게 변환되는 것 같다. 간단한 예시로 아래와 같이 보일 수 있다. import json dict_data = { 'str_data': '데이터', } text = json.dumps(dict_data) print(text) # 결과값 {"str_data": "\ub370\uc774\ud130"} 해결 방법으로는 ensure_ascii=False를 사용해준다. text = json.dumps(dict_data, ensure_ascii=False) 왜 이런일이 발생할까? 유니코드의 형태로 제공해주는 파이썬의 배려이며, 그것을 ensure_ascii라는 파라미터로 on/off 할 수 있는 것이다. 실제로 파이썬 콘솔창에 '.. 더보기
IndexError: list index out of range 리스트 데이터의 인덱스를 벗어난 경우에 발생합니다. 간단한 예시로는 아래와 같은 경우를 들 수 있습니다. list_data = [1, 2, 3] print(list_data[3]) list_data의 크기는 3이기 때문에 인덱스는 0, 1, 2밖에 존재하지 않는데 3이라는 인덱스에 접근했기 때문에 에러가 발생합니다. 주로 위와 같이 직접 코드에 값을 입력하는 경우엔 실수가 잘 발생하지 않습니다. 문제는 런타임에 결정되는 값일 경우에 함수를 잘못 짜서 발생하는 경우가 대다수 입니다. 아래와 같은 예시를 볼 수 있겠습니다. def is_valid(list_data): return list_data[0] == 'valid_data' list_data의 길이가 0보다 클 것이라고 가정하고 짜여진 함수 이기 때문.. 더보기