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
반응형

 티스토리 

 

PYTHON 소수점자리 

Python에서 매우 큰 소수점 자리수를 정확하게 표현하기 위해서는 기본적인 float 타입 대신에 decimal 모듈의 Decimal 클래스를 사용할 수 있습니다. Decimal 클래스는 소수점 아래의 정확도를 유지하면서 연산을 수행할 수 있도록 설계되었으며, 특히 금융 계산과 같이 정밀한 소수 연산이 필요한 경우에 유용합니다.

먼저, decimal 모듈을 임포트하고, 정밀도를 설정할 수 있는 getcontext() 메서드를 사용하여 필요한 소수점 자리수를 설정합니다. 이후에 Decimal 객체를 생성하여 계산을 수행합니다.



1.코드리뷰

from decimal import Decimal, getcontext

# 필요한 소수점 자리수만큼 정밀도 설정
getcontext().prec = 200  # 예시로 200자리까지의 정밀도를 설정

# 매우 큰 소수점을 가진 숫자 표현 ( 실제 원주율 값이 아닌 임의의 숫자를 입력했습니다.)
pi = Decimal('3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679')
pi = str(pi) # 문자열로 변환하여 문자 하나씩 카운트 하기 위함
# Decimal 객체를 사용한 계산 예시
value = 3 # 찾고자 하는 원하는 자릿수 3.14에서 '3',  '.'  두개의 문자를 고려해서 입력 
for i in range (3) : # range 3 은 0, 1, 2 
    print (f'{i}번째')
    print (pi[i+2]) # 소숫점 3.14 에서 앞의 3과 .의 카운트 2번을 더해줌으로써 소수점자리 부터 출력
result = pi[4] # 리스트의 시작은 0번째부터 3.14 에서 0번째는 3 , 소숫점자리수는 2번째 


print("결과값은? : ", result)
반응형

2. 코드리뷰 2

라이브러리 임포트: decimal 라이브러리를 임포트하고, 필요한 경우 Decimal 객체와 getcontext를 사용해 계산 정밀도를 설정합니다.

decimal.Decimal을 사용하면 더 정밀한 소수점 제어가 가능합니다. 특히 금융 계산에서 유용하게 사용됩니다.

아래 예제에서는 Decimal 객체의 quantize 메서드를 사용하여 소수점 이하 두 자리까지 반올림합니다.

각 방법은 상황에 따라 다르게 사용될 수 있습니다. round 함수는 간단한 반올림에 적합하고, format 함수나 문자열 포매팅은 출력 형식을 더 세밀하게 제어할 수 있습니다. Decimal 모듈은 정밀한 계산이 필요할 때 유리합니다. 사용자의 요구 사항과 상황에 맞는 방법을 선택하세요.
더보기

from decimal import Decimal, ROUND_HALF_UP

number = Decimal('3.14159')
rounded_number = number.quantize(Decimal('.01'), rounding=ROUND_HALF_UP)  # 3.14



계산 정밀도 설정: getcontext().prec를 사용하여 계산의 정밀도를 원주율의 소수점 이하 자릿수보다 높게 설정합니다. 여기서는 n번째 소수점 자리수 값을 원하기 때문에, 계산 정밀도를 n+1 이상으로 설정해야 합니다. 계산 과정에서 발생할 수 있는 반올림 오류를 최소화하기 위해 여유를 두고 약간 더 높은 값을 설정하는 것이 좋습니다.

원주율 계산: 원주율을 계산하는 여러 방법 중 하나를 선택합니다. decimal 라이브러리는 직접 원주율을 계산하는 기능을 제공하지 않으므로, 일반적으로 사용되는 원주율 계산 공식을 사용해야 합니다. 예를 들어, 라이프니츠 공식이나 체비쇼프의 공식 등이 있습니다. 이 예제에서는 간단한 방법을 사용할 것입니다.

결과 출력: 계산된 원주율 값에서 n번째 소수점 자리수를 추출하여 출력합니다.

추가 예제 코드 :

더보기

# decimal 라이브러리를 사용하여 고정밀도 연산을 수행
from decimal import Decimal, getcontext

# 원주율(pi) 계산을 위한 정밀도 설정 (300번째 소숫점 이상의 정확도 필요)
getcontext().prec = 305

# 원주율(pi) 계산에 사용될 라이프니츠 공식의 변형 또는 다른 방법을 구현
# 여기서는 예시를 위해 간단화된 접근 방법을 선택
# 참고: 실제 원주율 계산을 위해서는 BBP 공식 등 효율적인 알고리즘이 사용됨
pi_approx = sum(1/Decimal(16)**k *
                (Decimal(4)/(8*k+1) - Decimal(2)/(8*k+4) -
                 Decimal(1)/(8*k+5) - Decimal(1)/(8*k+6)) for k in range(100))

# 원주율의 300번째 소숫점 자리수 추출
pi_300th_digit = str(pi_approx)[302]

print(pi_300th_digit)

728x90

 

마무리

- 이번 포스팅은  매우큰 소수점 자리수 처리에 대해 알아봤습니다.

 
 

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

 

 

728x90
반응형

+ Recent posts