Python에서 class 선언시 object를 꼭 상속 받자

python은 전역 객체를 선언할 경우 해당 클래스를 메모리에 올리는 초기 작업에서 실행 된다. 예를 들어 다음과 같은 코드에서 # 1, # 2 순서로 실행된다.

import lahuman

class test(object):
	a = lahuman.A() # 1 : 

	def b(self):
		pass

main python

import test # 1

if __name__ == '__main__':
    t = test()
    t.b() # 2

또한 test 클래스가 object를 상속 받지 않을 경우 객체 생성시 object를 상속 받지 않으면 객체생성시 new 메소드가 호출되지 않는다.



Posted by lahuman

파이썬을 이용한 압축 해제와 동시에 파일 이름 변경

특정 사이트에서 대량의 압축된 파일을 받아 하나의 디렉터리에 풀어야 하는 미션이 떨어졌다.

문제는 같은 파일 명이 중복으로 발생할 수 있다.

이에 대한 해결책으로 다음 2개의 방법으로 고민했다.

  1. 파일 압축 해제 후 MV 명령어로 이름 변경
  2. 압축을 해제할 때 PATH를 줄 수 있는가?

1번의 방법은 누구나 쉽게 할 수 있을 것 같았다.

2번의 경우 가능 한지 조차 몰라서 Python에서 압축 관련 모듈인 ZipFile을 살펴보았다.

내용을 확인 결과 압축 파일에서 하나의 파일을 읽을 수 있는 read리는 function이 있다.

이를 이용해 다음과 같이 처리하였다

with ZipFile("filename.zip") as zf:
    
    file_list = map(lambda x: "/" + str(uuid.uuid4()), zf.filelist) # 파일 개수만큼 uuid를 생성
    idx = 0
    for zip_file in zf.namelist():  # 루프를 돌며 하나의 파일을 가져옴
        target_path = zip_save_path + file_list[idx]  # 저장되는 파일 위치
        with open(target_path, "wb") as f:  # 저장되는 파일을 쓰기 모드로 오픈
            f.write(zf.read(zip_file, pwd=self.password))  # 압축된 파일을 읽어서 타깃 파일로 저장

        idx += 1 # 다음 uuid 선택

파일은 내가 원하는 위치에 uuid 값으로 저장된다.

참고자료


Posted by lahuman

특정 디렉토리에서 구조를 출력 하는 방법

디렉토리의 구조를 출력 하는 방법은 2가지가 있다.

  1. Tree 모듈을 설치 한다.

tree 명령어는 많은 옵션을 제공하고 널리 사용되는 모듈이다.

다만 쉬운 설치를 위해서 인터넷이 되어야 한다.

  1. Command 를 이용한 출력
find . -type d | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/|-\1/"

설치가 필요 없고 단순하게 철력이 가능하다. 다만, 옵션이 없기 때문에 COMMAND를 조합 해야 한다. 예를 들어 abc 디렉토리를 제외 하고 싶다면 다음과 같은 명령어를 실행 해야 한다.

find . -type d | grep -v abc | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/|-\1/"

일회성으로 쓰기 좋다!

참고 자료


Posted by lahuman