728x90
반응형

 티스토리 

 

파이썬으로 작성된 스크립트를 .exe 실행파일 생성 과정

 이 작업을 수행하기 위해 일반적으로 사용되는 몇 가지 도구가 있습니다. 그중에서도 PyInstaller, cx_Freeze, py2exe가 가장 널리 사용됩니다. 각각의 도구는 약간씩 다른 기능과 사용 방법을 가지고 있으며, 사용자의 요구 사항에 따라 가장 적합한 도구를 선택할 수 있습니다.

PyInstaller는 사용이 간편하며크로스 플랫폼을 지원하여 Windows, macOS, Linux에서 사용할 수 있습니다. 단일 파일로 묶는 옵션이 있어 배포가 용이합니다.
cx_Freeze는 Python 스크립트를 실행 파일로 변환하는 데 사용되며, 여러 플랫폼을 지원합니다.
py2exe는 Windows에서만 사용할 수 있으며, Python 스크립트를 Windows 실행 파일로 변환합니다.
일반적인 PyInstaller 사용 방법을 예로 들어 설명해 드리겠습니다. 

반응형

1.사용 방법

.PyInstaller를 사용하여 Python 스크립트를 .exe 파일로 변환하는 과정은 다음과 같습니다:

PyInstaller 설치: PyInstaller를 설치하려면, Python이 설치된 환경에서 커맨드 라인이나 터미널을 열고 다음 명령어를 실행합니다.

pip install pyinstaller

 

실행 파일 생성: 스크립트가 위치한 디렉토리에서 다음 명령어를 실행하여 .exe 파일을 생성합니다. 여기서 your_script.py는 변환하려는 스크립트의 파일 이름입니다.

 

pyinstaller --onefile your_script.py

참고 : --onefile 대신 -F를 사용해도 동일하게 동작합니다.

아이콘 추가
--icon 옵션을 사용하여 실행 파일에 아이콘을 추가할 수 있습니다. 이는 애플리케이션의 전문성을 높이는 데 도움이 됩니다.

pyinstaller --onefile --icon=your_icon.ico your_script.py

 

추가 데이터 파일 포함
PyInstaller는 --add-data 옵션을 사용하여 실행 파일에 추가 데이터 파일이나 디렉토리를 포함시킬 수 있습니다. 이 옵션은 다음과 같은 형식을 사용합니다: 소스;대상 (Windows) 또는 소스:대상 (Unix)

pyinstaller --add-data 'data_folder;data' your_script.py

이렇게 하면, data_folder 내의 모든 파일이 실행 파일 내 data 폴더로 복사됩니다.

디버깅 모드
문제 해결 시, --debug 옵션을 사용하여 실행 파일을 디버깅 모드로 빌드할 수 있습니다. 이는 문제의 원인을 파악하는 데 유용합니다.

pyinstaller --debug all your_script.py

결과 확인
명령어 실행 후 dist 폴더가 생성되며그 안에 .exe 파일이 위치합니다--onefile 옵션은 모든 필요한 라이브러리와 함께 단일 실행 파일을 생성합니다이 옵션 없이 실행하면, 실행에 필요한 모든 파일을 포함한 폴더가 생성됩니다.

도움이 되셨다면 아래 화면 클릭으로 보다 나은 컨텐츠를 만드는데 큰 도움이 됩니다.

728x90

 

마무리

PyInstaller의 사용법과 기능은 상당히 광범위하며, 여기서 언급한 내용은 그 일부에 불과합니다.
PyInstaller의 공식 문서[PyInstaller Documentation](https://pyinstaller.readthedocs.io

- 이번 포스팅은 pyinstaller로 exe 파일 만들기에 대해 알아봤습니다.

 
 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

데이터 분석과 조작을 위한 Python의 판다스 라이브러리는 다양한 유형의 데이터를 처리할 수 있는 유연성을 제공

판다스 데이터프레임의 특정 열에 서로 다른 길이의 리스트를 직접 저장하는 것은 일반적인 사용 사례가 아닙니다. 데이터프레임의 각 행은 일반적으로 동일한 수의 열 값을 가지고 있어야 합니다. 하지만, 목표를 달성하기 위한 몇 가지 방법이 있습니다.

리스트를 문자열로 변환하여 저장
가장 간단한 방법 중 하나는 리스트를 문자열로 변환하고 이를 데이터프레임에 저장하는 것입니다. 이 방법은 데이터를 저장하고 검색하는 것은 쉽지만, 나중에 이 데이터를 다시 리스트로 변환해야 할 수도 있습니다.

각 리스트를 별도의 행으로 저장
리스트의 각 항목을 별도의 행으로 확장하여 저장할 수 있습니다. 이 경우, 다른 열의 데이터는 NaN 또는 다른 기본값으로 채워질 수 있습니다.

반응형

1.코드리뷰

리스트를 문자열로 변환하고 이를 데이터프레임에 저장하는 예제

import pandas as pd

# 리스트 데이터
var_a = [1, 2, 3]
var_b = [1, 2, 3, 4, 5]

# 리스트를 문자열로 변환
str_a = str(var_a)
str_b = str(var_b)

# 데이터프레임 생성
df = pd.DataFrame({
    'a': [str_a],  # 리스트를 문자열로 변환하여 저장
    'b': [str_b]
})

print(df)

위의 코드는 각 리스트를 문자열로 변환하여 데이터프레임의 단일 행에 저장합니다. 필요한 경우, eval() 함수를 사용하여 문자열을 다시 리스트로 변환할 수 있습니다.

만약 리스트의 각 항목을 데이터프레임의 별도 행으로 확장하려는 경우 더 복잡한 로직이 필요하며, 이는 특정한 요구 사항에 따라 달라질 수 있습니다. 위의 방법은 요구 사항을 충족시키는 간단한 해결책을 제공하지만, 실제 사용 사례에 따라 적절한 접근 방식을 선택해야 합니다.

 

 

도움이 되셨다면 아래 화면 클릭으로 보다 나은 컨텐츠를 만드는데 큰 도움이 됩니다.

728x90

2. 코드리뷰

리스트의 각 항목을 데이터프레임의 별도 행으로 확장하여 저장하는 방식은, 각 리스트를 다루는 방식에 따라 달라질 수 있습니다. 

다음 예제에서는 var_a와 var_b 리스트의 각 항목을 별도의 행으로 확장하여 저장하는 방법을 보여줍니다. 이 때, 길이가 서로 다른 두 리스트를 처리하기 위해 더 긴 리스트의 길이에 맞춰 데이터프레임을 생성하고, 더 짧은 리스트에는 NaN 값으로 채웁니다.

import pandas as pd
import numpy as np

# 리스트 데이터
var_a = [1, 2, 3]
var_b = [1, 2, 3, 4, 5]

# 가장 긴 리스트의 길이를 기준으로 인덱스 범위 생성
max_length = max(len(var_a), len(var_b))

# 더 짧은 리스트를 NaN으로 패딩
padded_a = var_a + [np.nan] * (max_length - len(var_a))
padded_b = var_b + [np.nan] * (max_length - len(var_b))

# 데이터프레임 생성
df = pd.DataFrame({
    'a': padded_a,
    'b': padded_b
})

print(df)

이 코드는 var_a와 var_b를 각각 'a', 'b' 열에 저장하되, 두 열의 길이가 서로 다를 경우 더 짧은 리스트를 NaN 값으로 채워 길이를 맞춥니다. 이렇게 하면 두 열의 길이가 다른 리스트를 포함하는 데이터프레임을 효과적으로 처리할 수 있습니다. 이 방식은 데이터 분석이나 처리 과정에서 특정 조건에 따라 각 열의 값들을 다룰 때 유용할 수 있습니다.

3. 코드리뷰 - 매우 쉽게! 하기!

필자 처럼 머리가 나쁘면 아래와 같이 그냥 임의의 리스트 값을 크게 만들고 NAN으로 채워 넣고 쓰기!
추가로 리뷰할 멘트도 필요 없을만큼 간단하지만, 테스트용으로만 사용하겠네요. 

import numpy as np

# NaN 값 100개를 포함하는 리스트 생성
nan_list = [np.nan] * 100

print(nan_list)

 

마무리

- 이번 포스팅은 서로 다른 행의 수를 가진 값을 데이터 프레임에 저장하는 방법에 대해 알아봤습니다.

 
 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

728x90
반응형
728x90
반응형

 티스토리 

 

개요

 tar.gz 파일을 윈도우 알집 프로그램으로 보면 파일의 끝이 열리지 않는 에러 메세지가 뜨지만, 파일들의 목록도 보이고 압축은 풀린다.

python의 tarfile 라이브러리로 파일을 열면 Readfile error 와 eof error 이 생기는데, 에러가 생겨도 파일을 읽고 풀수 있는 방법을 알아 보자.

파일의 끝이나 읽기 에러가 발생했을 때도 tarfile 라이브러리를 사용하여 압축 파일 내용을 읽고 압축을 해제할 수 있는 방법은, 에러를 무시하면서 파일을 열고 처리하는 것입니다. 이를 위해서는 먼저 파일을 열 때 ignore_errors=True 파라미터를 사용할 수 없음에 유의해야 합니다. 대신, try-except 블록을 사용하여 에러를 포착하고, 에러가 발생하더라도 프로세스를 계속 진행할 수 있게 합니다.

아래의 코드는 EOFError와 ReadError를 처리하는 방법을 보여줍니다. 이 코드는 압축 파일을 열고, 에러가 발생할 경우 이를 캐치하고, 가능한 모든 파일을 압축 해제합니다. 에러가 발생하더라도 가능한 모든 파일이 압축 해제될 때까지 진행됩니다.

 

 py7zr로 .7z와 함께 사용하는 방법은 아래 글 참조 바랍니다.
https://costzerocode.tistory.com/87
반응형

1.코드리뷰 

 tarfile 모듈의 open 함수를 사용할 때 mode 매개변수를 'r:*'로 설정하여 transparent compression을 사용하는 것이 추천됩니다. 

이는 gzip, bzip2, lzma 압축된 파일을 투명하게 읽을 수 있게 해주며, 자동으로 적절한 압축 해제 방법을 선택합니다. 또한, 파일을 열 때 발생할 수 있는 ReadError 또는 CompressionError를 처리하기 위해 예외 처리 구문을 사용합니다.

import tarfile

try:
    # 'r:*' 모드는 압축 형식을 자동으로 감지하여 읽기를 시도합니다.
    with tarfile.open('your_file.tar.gz', 'r:*') as tar:
        tar.extractall(path="extracted_files")
        for member in tar.getmembers():
            print(member.name)
except tarfile.ReadError as e:
    print(f"파일을 읽는 중 에러 발생: {e}")
except tarfile.CompressionError as e:
    print(f"압축 해제 중 에러 발생: {e}")

이 코드는 지정된 tar.gz 파일을 열고, try-except 블록을 사용하여 파일을 읽거나 압축을 해제하는 과정에서 발생할 수 있는 에러를 처리합니다. tarfile.open의 'r:*' 모드는 파일의 압축 방식을 자동으로 감지하고 해제하여, gzip, bzip2, lzma 압축된 파일을 투명하게 처리할 수 있게 해줍니다. 

이렇게 하면 다양한 압축 포맷의 파일을 보다 유연하게 처리할 수 있습니다.

 

2. 코드리뷰

import tarfile

def extract_tarfile_ignore_errors(filename, extract_path="."):
    try:
        # 압축 파일 열기
        with tarfile.open(filename, 'r:*') as tar:
            # 가능한 모든 멤버 추출
            for member in tar.getmembers():
                try:
                    tar.extract(member, path=extract_path)
                except (tarfile.TarError, EOFError) as e:
                    print(f"{member.name} 추출 중 오류 발생: {e}")
                    continue
    except (tarfile.ReadError, EOFError) as e:
        print(f"파일 열기 실패: {e}")

# 실제 파일 경로로 'your_file.tar.gz'를 교체하세요.
extract_tarfile_ignore_errors('your_file.tar.gz', 'extracted_files')

 

이 스크립트는 파일을 열 때 발생할 수 있는 ReadError와 멤버별로 압축 해제할 때 발생할 수 있는 EOFError 및 tarfile.TarError를 처리합니다각 멤버를 압축 해제할 때 에러가 발생하면, 그 멤버는 건너뛰고 다음 멤버로 넘어갑니다. 이 방법을 통해, 파일의 끝에 도달하거나 읽을 수 없는 부분이 있더라도 가능한 많은 파일을 추출할 수 있습니다.

 

728x90

 

마무리

- 이번 포스팅은 tar.gz 압축풀때 tarfile의 사용 방법에 대해 알아봤습니다.

 py7zr을 사용하여 .7z와 함께 사용하는 방법은 아래 글 참조 바랍니다.
https://costzerocode.tistory.com/87

 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

현재 디렉토리에 있는 파일 접

Python의 Path 객체를 사용하여 현재 실행 중인 스크립트 파일(__file__)과 동일한 디렉토리에 있는 "abc.csv" 파일의 경로를 생성하는 방법을 보여줍니다. 여기에서 Path는 pathlib 모듈의 일부로, 파일 시스템 경로를 객체 지향적으로 쉽게 다룰 수 있게 해줍니다.

아래 광고 클릭으로 보다 많은 정보를 나눌수 있는 큰힘이 됩니다.~!  

반응형

1. 코드리뷰

from pathlib import Path

# 현재 스크립트와 같은 디렉토리에 있는 'abc.csv' 파일의 경로 생성
fpath = Path(__file__).parent / "abc.csv"

# 생성된 경로 확인
print(fpath)

 

코드 분석 아래 클릭 : 

더보기

Path(__file__): __file__ 전역 변수는 현재 실행 중인 Python 스크립트 파일의 경로를 포함합니다. Path(__file__)를 사용하면 이 경로를 Path 객체로 변환합니다. 이 객체는 파일 시스템 경로를 쉽게 조작할 수 있는 여러 메서드를 제공합니다.

.parent: Path 객체의 parent 속성은 현재 경로의 부모 디렉토리, 즉 현재 파일이 위치한 디렉토리의 경로를 Path 객체로 반환합니다.

/ "abc.csv": Path 객체를 사용할 때, / 연산자를 사용하여 경로를 쉽게 결합할 수 있습니다. 이 경우 "abc.csv" 파일명이 현재 스크립트 파일이 있는 디렉토리의 경로에 추가됩니다.

 

주의할 점
이 코드는 스크립트 파일 내에서 사용될 때 의도대로 작동합니다. Jupyter Notebook이나 대화형 Python 세션(IPython, Python REPL 등)에서 __file__ 변수는 정의되지 않습니다. 대화형 환경에서는 __file__ 대신 실제 경로 문자열이나 다른 방법을 사용해야 합니다.

파일 경로를 생성하고 나면, 이 경로를 사용해 파일을 읽거나 쓸 수 있습니다. 예를 들어, pandas 라이브러리를 사용하여 CSV 파일을 읽어올 때 fpath를 활용할 수 있습니다.

 

아래 광고 클릭으로 보다 많은 정보를 나눌수 있는 큰힘이 됩니다.~!  

728x90

2. 위의 코드를 개선한 예제

여기서는 먼저 파일 경로의 존재 여부를 검증하고, 파일이 존재하지 않을 경우 로깅하는 방법을 추가합니다.

from pathlib import Path
import logging

# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

 

파일 경로 생성 및 검증

try:
    # 현재 스크립트와 같은 디렉토리에 있는 'abc.csv' 파일의 경로 생성
    fpath = Path(__file__).parent / "abc.csv"

    # 파일 경로 검증
    if fpath.exists() and fpath.is_file():
        # 파일 경로가 유효하면 로깅
        logging.info(f"파일 경로 '{fpath}'가 확인되었습니다.")
    else:
        # 파일이 존재하지 않으면 예외 발생
        raise FileNotFoundError(f"파일 '{fpath}'를 찾을 수 없습니다.")
except NameError:
    # __file__이 정의되지 않은 경우(대화형 환경 등)
    logging.error("__file__ 변수가 정의되지 않았습니다. 스크립트 파일 내에서 이 코드를 실행해야 합니다.")
except FileNotFoundError as e:
    # 파일이 존재하지 않는 경우
    logging.error(e)

코드 분석 아래 클릭 :

더보기

이 코드는 다음 단계를 수행합니다:

로깅 설정: 프로그램의 실행 정보를 로깅하기 위해 logging 모듈을 설정합니다. 이 예제에서는 기본 로깅 레벨을 INFO로 설정하고, 로그 메시지의 형식을 지정합니다.

파일 경로 생성: Path 객체를 사용하여 현재 스크립트 파일이 위치한 디렉토리에 "abc.csv" 파일의 경로를 생성합니다.

예외 처리 추가:
NameError: 대화형 환경에서 __file__이 정의되지 않은 경우를 처리합니다.
FileNotFoundError: 지정된 경로의 파일이 존재하지 않을 경우를 처리합니다. 파일이 존재하지 않으면 예외를 발생시키고, 해당 예외를 캐치하여 로깅합니다.
경로 검증: exists()와 is_file() 메서드를 사용하여 파일 경로가 실제로 존재하는 파일을 가리키는지 확인합니다. 유효한 경우 해당 경로에 대한 정보를 로깅합니다.

이렇게 개선된 코드는 파일 경로의 존재를 검증하고, 예상치 못한 상황(예: 파일 누락, 대화형 환경에서의 사용)에 대해 유용한 로깅 정보를 제공합니다. 이는 디버깅 과정을 효과적으로 지원하고, 코드의 견고성을 높여줍니다.

 

마무리

- 이번 포스팅은 __file__ 매소드 활용 방법에 대해 알아봤습니다.

 
 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

매직 키워드에 대해 알아봅시다.

 Dunder method , Double UnderScore, Magic keyword, Special methods 라고도 불리기도 하지만, 
공식 문서에서는 special method라고 사용되네요.

1. 예제 모음 코드 리뷰

__init__  :
__init__ 메서드는 파이썬의 매직 메서드(또는 스페셜 메서드) 중 하나로, 클래스의 인스턴스가 생성될 때 자동으로 호출되는 생성자 함수입니다. 이 메서드는 인스턴스가 가지고 있어야 할 초기 상태를 설정하는 데 주로 사용됩니다.

class MyClass:
    def __init__(self, value1, value2):
        self.attribute1 = value1
        self.attribute2 = value2

# MyClass의 인스턴스 생성 시, __init__ 메서드가 자동으로 호출됩니다.
my_instance = MyClass("Hello", 123)
print(my_instance.attribute1)  # 출력: Hello
print(my_instance.attribute2)  # 출력: 123

위의 예제 코드 리뷰는 아래 클릭 :

더보기

__init__ 메서드는 첫 번째 매개변수로 인스턴스 자기 자신을 의미하는 self를 반드시 포함해야 합니다. 그 뒤에는 클래스 인스턴스화 시 필요한 추가 매개변수를 정의할 수 있습니다.

 

__str__: 인스턴스를 문자열로 변환할 때의 동작을 정의합니다. print() 함수나 str()에 객체를 전달했을 때 호출됩니다.

class MyClass:
    def __init__(self, name):
        self.name = name
        
    def __str__(self):
        return f"MyClass 인스턴스의 이름은 {self.name}입니다."

my_instance = MyClass("Test")
print(my_instance)

 

__repr__: 인스턴스의 부모 객체 이름을 확인합니다. 주로 디버깅과 로깅 목적으로 사용됩니다.

class MyClass:
    def __init__(self, name):
        self.name = name
        
    def __repr__(self):
        return f'MyClass("{self.name}")'

my_instance = MyClass("Test")
print(repr(my_instance))

실행 결과 아래 클릭

더보기

부모 객체와 입력한 argument 값이 출려 되는걸 알수 있다.

 

__len__: 컨테이너 타입의 길이를 반환합니다. len() 함수가 호출될 때 실행됩니다.

class MyContainer:
    def __init__(self, data):
        self.data = data
        
    def __len__(self):
        return len(self.data)

container = MyContainer([1, 2, 3, 4])
print(len(container))

실행 결과 값은 아래 클릭 :

 

__getitem__: 컨테이너 타입에서 항목을 가져올 때의 동작을 정의합니다.

class MyContainer:
    def __init__(self, data):
        self.data = data
        
    def __getitem__(self, key):
        return self.data[key]

container = MyContainer(["a", "b", "c"])
print(container[1])  # 출력: b

 

이러한 스페셜 메서드를 사용함으로써 파이썬 클래스의 동작을 매우 유연하게 커스터마이징할 수 있습니다. 클래스를 더 풍부하고 파이썬스럽게 만들고 싶다면, 이러한 메서드들을 적극적으로 활용해보세요.

 

728x90

 

마무리

- 이번 포스팅은 special method, magic method, 매직 매소드..에 대해 알아봤습니다.

 
 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

.7z format을 지원하는 라이브러리

7z 압축 포맷은 고압축률로 잘 알려져 있으며, 파이썬에서 이 포맷을 다루기 위해 여러 서드파티 라이브러리가 개발되었습니다. 주요 7z 파일 처리용 라이브러리와 각각의 특징을 아래에 소개하고, 사용 상황에 따른 추천을 드리겠습니다.

1. 코드리뷰


실무에서 매우 유용하게 쓰이는 코드이며, 관련 앱 개발에 필수로 고려해야 될 사항으로 생각 되네요.

이 코드들을 작성하기 전에, py7zr 라이브러리가 설치되어 있어야 합니다. 설치가 필요한 경우, pip install py7zr 명령어로 설치할 수 있습니다.
# 필요한 코드를 Python Code Interpreter에서 작성 및 최적화합니다.

# 1. 기본적인 압축 파일 생성
import py7zr

def create_archive(archive_name, file_paths):
    with py7zr.SevenZipFile(archive_name, 'w') as archive:
        for file_path in file_paths:
            archive.writeall(file_path, arcname=None) # arcname을 None으로 설정하면 파일 경로에서 마지막 부분을 사용

# 2. 압축 파일 해제
def extract_archive(archive_name, output_path):
    with py7zr.SevenZipFile(archive_name, 'r') as archive:
        archive.extractall(path=output_path)

# 3. 파일 목록 조회
def list_archive_contents(archive_name):
    with py7zr.SevenZipFile(archive_name, 'r') as archive:
        return archive.getnames()

# 4. 암호화된 압축 파일 생성
def create_encrypted_archive(archive_name, file_paths, password):
    with py7zr.SevenZipFile(archive_name, 'w', password=password) as archive:
        for file_path in file_paths:
            archive.writeall(file_path, arcname=None)

# 5. 여러 폴더를 개별 압축 파일로 생성
def create_multiple_archives(folder_paths):
    for folder_path in folder_paths:
        archive_name = f"{folder_path}.7z"
        with py7zr.SevenZipFile(archive_name, 'w') as archive:
            archive.writeall(folder_path, arcname=None)

# 함수 호출은 주석 처리하여 실행 방지
# create_archive('example.7z', ['file1.txt', 'file2.txt'])
# extract_archive('example.7z', 'output_folder')
# contents = list_archive_contents('example.7z')
# create_encrypted_archive('encrypted.7z', ['file1.txt', 'file2.txt'], 'password')
# create_multiple_archives(['folder1', 'folder2'])

 

아래 클릭후 추가 리뷰 내용 확인

더보기

py7zr.SevenZipFile을 사용할 때 with 문을 사용하는 구체적인 이유는 다음과 같습니다:  


- with 문을 사용하는 주된 이유는 리소스 관리입니다. 특히, 파일 작업을 할 때 with 문을 사용하면 파일을 열고 나서    작업이 완료되면 자동으로 파일을 닫아주기 때문에 매우 유용합니다. 이는 파일 핸들 누수를 방지하고 코드를 더        안전하게 만들어줍니다.

자동 리소스 해제: with 문은 context manager 프로토콜을 사용합니다. py7zr.SevenZipFile 클래스는 이 프로토콜을 구현하며, with 블록의 실행이 끝날 때 자동으로 close() 메서드를 호출합니다. 이는 열린 압축 파일이 안전하게 닫히도록 보장하며, 모든 데이터가 올바르게 기록되고 버퍼가 비워지는 것을 확실하게 합니다.

예외 처리: 파일 작업 중에 예외가 발생할 경우, with 문은 예외를 적절히 처리할 수 있는 구조를 제공합니다. 즉, 예외가 발생하더라도 SevenZipFile 객체의 close() 메서드가 호출되어 리소스가 제대로 해제됩니다. 이는 파일이나 다른 시스템 리소스가 잠기는 상황을 방지합니다.

코드의 가독성: with 문을 사용하면 리소스 관리 로직을 명시적으로 보여주지 않아도 됩니다. 코드를 읽는 사람은 with 블록 내에서 열린 리소스가 블록을 벗어나는 순간 안전하게 해제될 것이라는 것을 알 수 있으므로, 코드의 의도를 더 쉽게 파악할 수 있습니다.

결론적으로, with py7zr.SevenZipFile('your_large_file.7z', mode='r') as z: 구문을 사용함으로써, .7z 파일을 열고 작업 후 자동으로 닫으며, 이 과정에서 발생할 수 있는 예외를 관리하고, 코드의 안정성과 가독성을 향상시키는 이점을 얻을 수 있습니다.

 

 

반응형

2. 함수별 코드리뷰

  1. create_archive: 지정된 파일이나 폴더들을 .7z 파일로 압축합니다. 여기서 file_paths는 압축하고자 하는 파일 경로의 리스트입니다.
  2. extract_archive: .7z 파일을 지정된 경로에 해제합니다. archive_name은 해제하고자 하는 .7z 파일의 이름이며, output_path는 파일이 해제될 경로입니다.
  3. list_archive_contents: .7z 압축 파일 내의 파일 목록을 조회합니다. 파일 목록은 파일 이름의 리스트로 반환됩니다.
  4. create_encrypted_archive: 비밀번호를 사용하여 파일이나 폴더들을 암호화된 .7z 파일로 압축합니다. password 파라미터를 통해 암호화에 사용될 비밀번호를 설정할 수 있습니다.
  5. create_multiple_archives: 주어진 폴더들 각각을 별도의 .7z 파일로 압축합니다. 각 폴더 이름에 기반하여 압축 파일 이름이 결정됩니다.
이 코드는 py7zr 라이브러리가 설치된 Python 환경에서 실행할 수 있으며, 필요에 따라 코드를 수정하여 다른 상황에 맞게 사용할 수 있습니다. 코드의 사용 예제나 추가적인 기능이 필요한 경우, 질문해 주세요. ​

 

 

728x90

마무리

- 이번 포스팅은 py7zr 라이브러리 사용하는 방법에 대해 알아봤습니다.

- 7z 압축 포맷은 고압축률로 잘 알려져 있으며, 파이썬에서 이 포맷을 다루기 위해 여러 서드파티 라이브러리가 개발되었습니다. 주요 7z 파일 처리용 라이브러리와 각각의 특징을 아래에 소개하고, 사용 상황에 따른 추천을 드리겠습니다.

1. py7zr
특징: 파이썬에서 7z 압축 포맷을 직접적으로 다룰 수 있는 가장 대표적인 라이브러리입니다. LZMA와 LZMA2 압축 알고리즘을 지원하며, 파일 압축, 압축 해제, 암호화, 복수 볼륨 처리 등 다양한 기능을 제공합니다.
적합한 사용 상황: 고압축률을 요구하는 다양한 프로젝트에서 7z 파일을 생성하거나 압축 해제할 필요가 있을 때.
2. libarchive
특징: libarchive는 다양한 압축 포맷을 지원하는 C 라이브러리이며, 파이썬에서는 python-libarchive를 통해 사용할 수 있습니다. 7z 포맷을 포함하여 tar, rar 등 여러 압축 포맷을 지원합니다.
적합한 사용 상황: 다양한 압축 포맷을 하나의 라이브러리에서 지원받고 싶을 때, 특히 다양한 타입의 압축 파일을 처리해야 하는 경우.
3. PyLZMA
특징: LZMA 압축 알고리즘에 초점을 맞춘 라이브러리로, 7z 파일 내의 LZMA 압축을 사용한 파일들을 처리할 수 있습니다. 비록 7z 포맷의 모든 기능을 지원하지는 않지만, LZMA 알고리즘을 사용하는 파일에 대해서는 좋은 성능을 제공합니다.
적합한 사용 상황: LZMA 압축에 특화된 작업을 할 때, 특히 7z 파일 내의 LZMA 압축된 내용을 다루고 싶을 때.
추천
대부분의 경우, py7zr를 추천합니다. 이 라이브러리는 7z 파일 포맷에 대한 광범위한 지원을 제공하며, 파이썬 생태계 내에서 가장 널리 사용되고 있습니다. 사용하기 쉬운 API와 고압축률, 다양한 기능을 제공하기 때문에 대부분의 7z 관련 작업에 적합합니다.

다만, 프로젝트에서 다양한 압축 포맷을 동시에 다뤄야 한다면, libarchive를 고려할 수 있습니다. 이 라이브러리는 여러 압축 포맷에 대한 지원을 제공하므로, 하나의 라이브러리로 여러 작업을 처리할 수 있는 유연성을 제공합니다.

각 라이브러리의 설치와 사용 방법은 다음과 같습니다:

py7zr 설치: pip install py7zr
python-libarchive 설치: pip install libarchive
PyLZMA 설치: pip install pylzma
프로젝트 요구 사항과 환경에 맞는 라이브러리를 선택하여 고효율적인 압축 작업을 수행할 수 있습니다.
 
 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

예외 처리 - try-except

파이썬의 try-except 구문은 예외 처리를 위해 사용됩니다. 예외 처리는 프로그램 실행 중에 발생할 수 있는 오류(예외)를 처리하여 프로그램이 중단되지 않고 계속 실행될 수 있도록 하는 기능입니다. 이러한 처리는 프로그램의 안정성과 사용자 경험을 향상시키는 데 중요합니다.

1. 코드리뷰

try:
    # 오류가 발생할 가능성이 있는 코드
except 예외유형 as 변수명:
    # 예외 처리 코드
try:
    x = 5
    y = 0
    result = x / y
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

이 코드는 y가 0이므로, ZeroDivisionError 예외가 발생합니다except 블록이 이를 캐치하고 "0으로 나눌 수 없습니다."를 출력합니다.

 

반응형

2. 다양한 예외 처리

try:
    # 코드
except (RuntimeError, TypeError, NameError):
    # 여러 예외 처리

else와 finally
else 블록: 모든 except 블록이 실행되지 않을 때 실행됩니다. 즉, 예외가 발생하지 않았을 때 실행할 코드를 담습니다.
finally 블록: 예외 발생 여부와 관계없이 항상 실행됩니다. 주로 리소스 해제 등의 정리 작업에 사용됩니다.

try:
    print("try 블록 실행")
except Exception as e:
    print(f"예외 발생: {e}")
else:
    print("예외가 발생하지 않았습니다.")
finally:
    print("항상 실행되는 finally 블록")

 

2. 파일처리

파일을 다룰 때 발생할 수 있는 예외를 처리하는 방법입니다. 파일이 존재하지 않을 때 FileNotFoundError 예외가 발생합니다.

try:
    with open('non_existent_file.txt', 'r') as f:
        content = f.read()
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")

사용자 입력 처리
사용자 입력을 처리하면서 발생할 수 있는 ValueError를 처리하는 예제입니다. 사용자가 숫자가 아닌 다른 값을 입력했을 때 이를 처리합니다.

더보기

try:
    user_input = int(input("숫자를 입력하세요: "))
    print(f"입력한 숫자는 {user_input}입니다.")
except ValueError:
    print("숫자가 아닌 값을 입력하였습니다. 숫자를 입력해주세요.")

리스트 인덱스 처리

리스트에서 발생할 수 있는 IndexError 예외를 처리하는 방법입니다. 사용자가 리스트의 범위를 벗어나는 인덱스에 접근하려 할 때 이를 처리합니다.

더보기

my_list = [1, 2, 3]

try:
    print(my_list[5])
except IndexError:
    print("리스트의 범위를 벗어난 인덱스에 접근하려고 했습니다.")

복수의 예외 처리

하나의 try 블록에서 여러 유형의 예외를 처리하는 방법입니다. 이는 다양한 오류 상황을 하나의 코드 블록에서 처리할 수 있게 해줍니다.

try:
    # 다양한 예외 발생 가능성이 있는 코드
    # 예를 들어, 0으로 나누기 시도 또는 잘못된 타입의 연산 시도
    result = 1 / 0
except (ZeroDivisionError, TypeError) as e:
    print(f"오류 발생: {e}")

728x90

이러한 예제들은 기본적인 사용법부터 복잡한 상황에서의 예외 처리 방법까지 다양한 시나리오를 보여주며, 블로그 독자들이 try-except 구문을 이해하고 자신의 프로젝트에 적용하는 데 도움이 될 것입니다.

마무리

- 이번 포스팅은 try-except  예외 처리 구문에 대해 알아봤습니다.

 
 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

기본 팝업창 예제로 공부해보자.

PySimpleGUI는 다양한 팝업 창을 포함하여 파이썬에서 GUI 어플리케이션을 만들기 위한 간단한 방법을 제공합니다. 다음은 PySimpleGUI에서 다양한 유형의 팝업 창을 사용하는 방법을 보여주는 예제 모음입니다. 자세한 문서와 더 많은 예제는 PySimpleGUI 공식 문서를 참고하세요.

1. Basic Popup ( 기본창 )

  The most basic form of popup to display a message:

가장 기본적인 팝업창 메세지 :

import PySimpleGUI as sg

sg.popup('CostZeroCode')

코드 실행결과(Output)

반응형

2. Popup with Title( 제목창이 있는 팝업창)

A popup window with a custom title:

import PySimpleGUI as sg

sg.popup('This is the main message', title='Custom Title')

3. Popup with Multiple Lines ( 여러줄로 메세지 출력하는 창)


To display multiple lines of text, you can separate text using a newline character \n:

여러개의 텍스트 라인으로 팝업창 생성

import PySimpleGUI as sg

sg.popup('Line 1\nLine 2\nLine 3', title='Multiple Lines')

코드 결과

 

4. Popup to Get User Input

To get input from the user through a popup:

import PySimpleGUI as sg

user_input = sg.popup_get_text('Please enter something')
sg.popup(f'You entered: {user_input}')

 

5. Popup to Show an Error ( 에러 메시지 창)

For showing error messages:

import PySimpleGUI as sg

sg.popup_error('An error has occurred!')

코드 실행결과

5. Popup to Display an OK/Cancel Dialog

To ask the user a yes/no question:

OK 또는 Cancel 버튼 선택창

import PySimpleGUI as sg

result = sg.popup_ok_cancel('Do you want to proceed?')
sg.popup(f'You chose: {result}')

코드 실행결과

 

6. Popup with Custom Button Text ( 사용자 정의 버튼과 결과 출력창)

To create a popup with custom button texts:

사용자 정의 버튼 과 선택한 버튼의 텍스트를 출력하는 팝업

import PySimpleGUI as sg

result = sg.popup('Custom button text example', button_type=sg.POPUP_BUTTONS_YES_NO, custom_text=('Proceed', 'Stop'))
sg.popup(f'You chose: {result}')

코드 실행결
버튼 클릭 결과

7. Popup for Folder Selection

To ask the user to select a folder:

import PySimpleGUI as sg

folder = sg.popup_get_folder('Please select a folder')
sg.popup(f'You selected: {folder}')

실행 결과

이 예제들은 PySimpleGUI에서 팝업의 기본 사용법을 다룹니다. 이 템플릿들로 실험해 보고 PySimpleGUI 문서를 확인하여 더 고급 기능과 사용자 정의 옵션을 알아보세요.

These examples cover basic usage of popups in PySimpleGUI. Experiment with these templates and check the PySimpleGUI documentation for more advanced features and customization options.

 

728x90

 

 

마무리

- 이번 포스팅은 PysimplgeGUI 기본 팝업창 생성에 대해 알아봤습니다.

CostZeroCode

 
 
 

궁금한 사항은 lution2@gmail.com로 문의사항  주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형

+ Recent posts