해당 내용은 Mac (M1) 을 기준으로 작성되었습니다.

 

대규모 언어 모델을 로컬에서 실행하기 위해서 Ollama를 설치하고 구글의 최첨단 경량 오픈모델인 gemma를 다운받아서 간단히 돌려보고

LangChain으로 연결해봅니다.

 

간밤에 "LLM RAG Langchain 통합" 채팅방의 권진영님께서 친절하게 설치와 사용방법을 알려주셔서 다른분들도 간단히 설치해서 사용해보면 좋을거 같아서 정리해봅니다.

 

Ollama github에 가면 로컬환경에 설치가능한 설치파일들을 다운받을수있습니다.

https://github.com/ollama/ollama

 

GitHub - ollama/ollama: Get up and running with Llama 2, Mistral, Gemma, and other large language models.

Get up and running with Llama 2, Mistral, Gemma, and other large language models. - ollama/ollama

github.com

 

 

이중 macOS에 해당하는 설치파일을 다운로드 받아서 설치합니다. 설치는 너무 간단해서 의외이기도 합니다. 다운로드 받으면 디렉토리에 설치파일이 생기게되고 더블클릭해서 설치합니다.

다운로드된 설치파일

 

실행하면 아래처럼 설치가 시작됩니다. Next 클릭

설치파일 실행하면 설치시작

설치는 금방 완료됩니다.

 

설치가 완료되면 Terminal을 실행해서 Ollama를 실행합니다.

 

Gemma는 두개 모델을 제공하는데 먼저 가장작은 모델로 시작해 보겠습니다.

% ollama run gemma:2b
pulling manifest
pulling c1864a5eb193...   5% ▕███                     ▏  87 MB/1.7 GB  8.0 MB/s   3m17s

 

설치가 완료되면 메시지를 호출 할수있는 창이 뜨면서 설치가 완료됩니다.

% ollama run gemma:2b
pulling manifest
pulling c1864a5eb193... 100% ▕██████████████████████████████████████████████▏ 1.7 GB
pulling 097a36493f71... 100% ▕██████████████████████████████████████████████▏ 8.4 KB
pulling 109037bec39c... 100% ▕██████████████████████████████████████████████▏  136 B
pulling 22a838ceb7fb... 100% ▕██████████████████████████████████████████████▏   84 B
pulling 887433b89a90... 100% ▕██████████████████████████████████████████████▏  483 B
verifying sha256 digest
writing manifest
removing any unused layers
success
>>> hi
Hi! 👋 How can I assist you today? 😊

Is there anything I can help you with?

>>> Send a message (/? for help)

 

간단하게 "hi"로 인사해 봤습니다.

 

이제 실행창에서 나오도록 합니다 "/bye"를 입력합니다.

>>> /bye
Hello! 👋 It's nice to hear from you. How can I help you today? 😊

Is there anything I can do for you?

>>> /bye
(base) dongsik@dongsikleeui-MacBookPro ~ %

 

바로 내보내주지는 않으면 한번더 "/bye" 합니다

 

설치되어있는 모델을 확인할수도 있습니다.

% ollama list
NAME    	ID          	SIZE  	MODIFIED
gemma:2b	b50d6c999e59	1.7 GB	6 minutes ago

 

또한 설치된 모델을 삭제도 할수있습니다. 설치와 삭제가 너무간단합니다.

% ollama rm gemma:2b
deleted 'gemma:2b'
% ollama list
NAME	ID	SIZE	MODIFIED
%

 

그럼 다시 설치하고 간단히 사용방법을 설명합니다.

 

1. LangChain 으로 실행하기

# LangChain 설치
pip install langchain

 

import langchain
# LangChain 버전 확인
print('LangChain version:', langchain.__version__)

결과
LangChain version: 0.1.12

 

로컬에 설치든 ollama gemma:2b 모델을 사용하도록 설정하고 실행합니다.

from langchain_community.llms import Ollama
import logging

# logging 설정
logging.basicConfig(level=logging.INFO)

try:
    llm = Ollama(model="gemma:2b")
    
    # 프롬프트가 잘 정의되어 있는지 확인하는 것이 필요합니다. (모델의 기능에 따라 조정가능)
    prompt = ("Why is the sky blue?")
    
    response = llm.invoke(prompt)
    print(response)
except ImportError:
    logging.error("Failed to import Ollama from langchain_community. Is the package installed?")
except Exception as e:
    logging.error(f"An unexpected error occurred: {e}")

 

결과 :
The sky appears blue due to Rayleigh scattering. This scattering process occurs when light interacts with molecules in the Earth's atmosphere. 

* **Blue light has a longer wavelength than other colors**. This means it can penetrate further into the atmosphere. 
* **Blue light waves have more energy** than other colors, so they are more likely to scatter. 
* **Water vapor molecules** in the atmosphere absorb blue light more efficiently than other colors. 
* **Scattered blue light** is scattered in all directions equally, giving the sky its blue color.

The amount and intensity of blue scattering depends on several factors, including:

* **Particle size and density of the particles**: Smaller particles scatter light more efficiently than larger particles. 
* **The wavelength of light**: Blue light is scattered more strongly than other colors. 
* **Atmospheric conditions**: Temperature, humidity, and air density can also affect scattering.

Overall, the scattering of sunlight in the atmosphere creates the blue color of the sky.

 

url call로 호출하고 결과를 streaming 방식으로 stand out으로 출력합니다.

from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain_community.llms.ollama import Ollama

llm = Ollama(
    base_url="http://localhost:11434",
    model="gemma:2b",
    callback_manager=CallbackManager(
        [StreamingStdOutCallbackHandler()],
    ),
)

prompt = ("Why is the sky blue?")
response = llm.invoke(prompt)
print(response)

 

결과 :
The sky appears blue due to Rayleigh scattering. Rayleigh scattering is the scattering of light by particles of a shorter wavelength, such as blue light. This scattering causes longer wavelengths, such as red and yellow light, to be scattered more than blue light. As a result, the sky appears blue to us.The sky appears blue due to Rayleigh scattering. Rayleigh scattering is the scattering of light by particles of a shorter wavelength, such as blue light. This scattering causes longer wavelengths, such as red and yellow light, to be scattered more than blue light. As a result, the sky appears blue to us.

 

 

https://github.com/ollama/ollama/blob/main/docs/api.md

2. Command 창에서 curl로 /api/generate

streaming 

Reqeust
% curl http://localhost:11434/api/generate -d '{
  "model": "gemma:2b",
  "prompt":"Why is the sky blue?"
}'

Response
{"model":"gemma:2b","created_at":"2024-04-10T01:46:35.254492Z","response":"The","done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:46:35.291573Z","response":" sky","done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:46:35.325664Z","response":" appears","done":false}
... <생략>
{"model":"gemma:2b","created_at":"2024-04-10T01:46:44.741546Z","response":" the","done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:46:44.775088Z","response":" atmosphere","done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:46:44.810226Z","response":".","done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:46:44.845784Z","response":"","done":true,"context":[106,1645,108,4385,603,573,8203,3868,235336,107,108,106,2516,108,651,8203,8149,3868,3402,577,153902,38497,235265,1417,38497,12702,1185,33365,113211,675,24582,575,573,10379,235303,235256,13795,235269,14076,24582,576,23584,578,16175,235265,109,235287,5231,5200,2611,919,476,5543,35571,688,1178,3868,2611,235265,1417,3454,674,1185,33365,30866,573,13795,235269,978,3868,2611,603,30390,3024,774,1167,2116,235265,108,235287,5231,10716,2611,919,476,25270,35571,688,578,603,30390,978,16347,1178,3118,2611,235265,108,235287,714,5231,10526,576,38497,688,12014,611,573,35571,576,573,2611,235265,11569,235269,3868,2611,603,30390,978,1178,1156,9276,235265,108,235287,714,13795,919,978,23584,24582,1178,16175,24582,235269,948,3454,674,978,3118,2611,603,30390,3024,235265,1417,603,3165,573,8203,8149,3868,235265,109,4858,708,1009,5942,4691,1105,573,3868,8203,235292,109,235287,714,3868,2881,603,5231,38131,576,5809,168428,1417,3454,674,573,8203,877,4824,3868,20853,576,1368,5342,689,7033,665,603,235265,108,235287,714,3868,2881,603,1170,5231,1665,10918,731,38636,168428,1417,3454,674,573,8203,877,4824,3868,793,4391,1368,1536,692,708,575,573,2134,235265,108,235287,714,3868,2881,603,476,5231,2667,576,2611,38497,168428,1417,3454,674,2611,603,30390,575,832,16759,731,24582,575,573,13795,235265,108,235287,714,3868,2881,576,573,8203,603,476,5231,28205,44299,168428,1417,603,1861,573,13795,603,780,13596,12876,235269,578,573,38497,2185,12014,611,573,6581,576,573,33365,8761,577,573,16071,575,573,13795,235265,107,108],"total_duration":13164771833,"load_duration":3454744833,"prompt_eval_count":15,"prompt_eval_duration":115430000,"eval_count":282,"eval_duration":9592944000}

 

No streaming 

Request
% curl http://localhost:11434/api/generate -d '{
  "model": "gemma:2b",
  "prompt":"Why is the sky blue?",
  "stream": false
}'

Reponse
{"model":"gemma:2b","created_at":"2024-04-10T01:49:38.296228Z","response":"The sky is blue due to Rayleigh scattering. Rayleigh scattering is the scattering of light by particles of a shorter wavelength. This means that blue light has a greater wavelength and is scattered more than other colors. This is why the sky appears blue.","done":true,"context":[106,1645,108,4385,603,573,8203,3868,235336,107,108,106,2516,108,651,8203,603,3868,3402,577,153902,38497,235265,153902,38497,603,573,38497,576,2611,731,16071,576,476,25270,35571,235265,1417,3454,674,3868,2611,919,476,6561,35571,578,603,30390,978,1178,1156,9276,235265,1417,603,3165,573,8203,8149,3868,235265,107,108],"total_duration":1936533375,"load_duration":3180292,"prompt_eval_duration":272404000,"eval_count":49,"eval_duration":1658092000}

 

3. Command 창에서 curl로 /api/chat 

 

Chat Request (Streaming)

Request
% curl http://localhost:11434/api/chat -d '{
  "model": "gemma:2b",
  "messages": [
    {
      "role": "user",
      "content": "why is the sky blue?"
    }
  ]
}'

Response
{"model":"gemma:2b","created_at":"2024-04-10T01:27:16.070998Z","message":{"role":"assistant","content":"The"},"done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:27:16.108371Z","message":{"role":"assistant","content":" sky"},"done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:27:16.142158Z","message":{"role":"assistant","content":" appears"},"done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:27:16.175229Z","message":{"role":"assistant","content":" blue"},"done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:27:16.207642Z","message":{"role":"assistant","content":" due"},"done":false}
... <생략>
{"model":"gemma:2b","created_at":"2024-04-10T01:27:25.624649Z","message":{"role":"assistant","content":" higher"},"done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:27:25.658043Z","message":{"role":"assistant","content":" temperatures"},"done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:27:25.692536Z","message":{"role":"assistant","content":"."},"done":false}
{"model":"gemma:2b","created_at":"2024-04-10T01:27:25.725932Z","message":{"role":"assistant","content":""},"done":true,"total_duration":12244362334,"load_duration":2484924542,"prompt_eval_count":15,"prompt_eval_duration":103298000,"eval_count":286,"eval_duration":9654690000}

 

Chat request (No streaming)

Request
% curl http://localhost:11434/api/chat -d '{
  "model": "gemma:2b",
  "messages": [
    {
      "role": "user",
      "content": "why is the sky blue?"
    }
  ],
  "stream": false
}'

Response
{"model":"gemma:2b","created_at":"2024-04-10T01:30:16.821415Z","message":{"role":"assistant","content":"The sky appears blue due to Rayleigh scattering. This phenomenon occurs when sunlight interacts with molecules in the Earth's atmosphere.\n\n**Rayleigh Scattering:**\n\n* Sunlight is composed of all colors of the spectrum, including blue, violet, yellow, orange, and red.\n* When sunlight enters the atmosphere, it interacts with molecules such as nitrogen and oxygen molecules.\n* These molecules have different sizes and structures, which cause different wavelengths of light to scatter in different directions.\n* Blue light, with its shorter wavelengths, is scattered more strongly than other colors due to its shorter path length through the atmosphere.\n\n**Blue Sky:**\n\n* As a result, blue light is scattered in all directions from the Sun.\n* This scattering effect spreads out the Sun's light throughout the atmosphere, making the sky appear blue.\n* The intensity of blue light can vary slightly depending on factors such as altitude, temperature, and atmospheric conditions.\n\n**Other Factors:**\n\n* The scattering process depends on the size and density of the molecules, which is why the sky appears blue even though the Sun is a star of much greater temperature.\n* The atmosphere is composed of different gases with varying densities, which influences the scattering process.\n* Cloud and pollution can also affect the sky's color, with clouds reflecting blue light more efficiently than other colors.\n\n**Conclusion:**\n\nThe blue color of the sky is primarily caused by Rayleigh scattering of sunlight by molecules in the Earth's atmosphere. This scattering process spreads out the Sun's light throughout the sky, making it appear blue to us on Earth."},"done":true,"total_duration":11417865583,"load_duration":4883667,"prompt_eval_duration":270041000,"eval_count":324,"eval_duration":11140497000}

이 오류는 Latin-1 인코딩이 특정 문자를 처리할 수 없어서 발생하는 것으로 보입니다. 이 문제를 해결하기 위해 다음과 같은 몇 가지 접근 방법이 있습니다:

 

UTF-8 인코딩 사용: Python에서 기본적으로 UTF-8 인코딩을 사용하는 것이 좋습니다. UTF-8은 대부분의 유니코드 문자를 처리할 수 있습니다.

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

 

문자 인코딩 명시적으로 지정: 파일을 읽거나 쓸 때 문자 인코딩을 명시적으로 지정하여 UnicodeEncodeError를 방지할 수 있습니다.

with open('file.txt', 'w', encoding='utf-8') as f:
    f.write(data)

 

문자열 인코딩 변환: 문자열에 대해 encode() 함수를 사용하여 Unicode 문자열을 바이트 문자열로 변환할 수 있습니다.

encoded_string = your_string.encode('utf-8')

 

latin-1 대신 utf-8로 출력: 프로그램이 텍스트를 출력하는 경우, 출력 스트림의 인코딩을 utf-8로 설정하여 Unicode 문자를 올바르게 처리할 수 있습니다.

import sys
sys.stdout.reconfigure(encoding='utf-8')

 

이러한 접근 방법 중 하나를 사용하여 오류를 해결할 수 있습니다. 선택한 방법은 상황에 따라 다를 수 있으므로 실험을 통해 가장 적합한 방법을 찾아보시기 바랍니다.

B가 A보다 몇 퍼센트 큰지 계산하려면 다음과 같은 공식을 사용할 수 있습니다.

  1. A와 B의 값이 주어졌다고 가정합니다.
  2. B가 A보다 얼마나 큰지 계산합니다.
  3. 계산된 값에 100을 곱하여 백분율로 표시합니다.

수식으로 나타내면 다음과 같습니다.

 

예를 들어, A가 50이고 B가 70이라면 다음과 같이 계산할 수 있습니다.

 
 

따라서 B가 A보다 40% 큽니다.

 
 
 
 

Python의 pandas 라이브러리에서 DataFrame 내에 특정 컬럼(열)이 존재하는지 확인하는 것은 데이터 분석 과정에서 자주 필요한 작업입니다. 이를 확인하는 방법은 여러 가지가 있지만, 가장 직관적이고 간단한 방법은 in 키워드를 사용하는 것입니다. 다음은 이 방법과 함께 몇 가지 다른 방법을 소개합니다.

1. in 키워드 사용

in 키워드는 Python의 기본 문법 중 하나로, 어떤 요소가 리스트나 문자열, 딕셔너리의 키 등에 존재하는지 여부를 반환합니다. pandas DataFrame의 컬럼은 내부적으로 리스트 형태로 관리되므로, 이 키워드를 사용하여 특정 컬럼이 존재하는지 쉽게 확인할 수 있습니다.

import pandas as pd

# 샘플 데이터 생성
data = {'Name': ['John', 'Anna'], 'Age': [28, 34], 'City': ['New York', 'Paris']}
df = pd.DataFrame(data)

# 'Age' 컬럼이 있는지 확인
if 'Age' in df:
    print('컬럼이 존재합니다.')
else:
    print('컬럼이 존재하지 않습니다.')

 

2. columns 속성과 in 키워드 사용

DataFrame.columns는 DataFrame의 모든 컬럼 이름을 포함하고 있습니다. 이 속성을 활용하여 in 키워드와 함께 특정 컬럼이 존재하는지 여부를 확인할 수 있습니다. 이 방법은 첫 번째 방법과 매우 유사합니다.

# 'City' 컬럼이 존재하는지 확인
if 'City' in df.columns:
    print('컬럼이 존재합니다.')
else:
    print('컬럼이 존재하지 않습니다.')

 

3. hasattr 함수 사용

hasattr 함수는 객체가 특정 속성(또는 메서드)을 가지고 있는지 여부를 확인할 때 사용됩니다. 하지만 DataFrame의 컬럼을 직접적인 속성으로 확인하는 데는 적합하지 않으므로, 이 방법은 DataFrame 컬럼을 확인하는 데 권장되지 않습니다.

4. try-except 구문 사용

특정 컬럼에 접근하려고 할 때, 그 컬럼이 존재하지 않으면 KeyError가 발생합니다. 이를 이용하여 try-except 구문으로도 컬럼의 존재 여부를 확인할 수 있지만, 이 방법은 특정 작업을 시도하면서 동시에 컬럼의 존재 여부를 확인할 때 주로 사용됩니다. 컬럼 존재 여부만을 확인하기 위해 권장되는 방법은 아닙니다.

try:
    df['NonexistentColumn']
    print('컬럼이 존재합니다.')
except KeyError:
    print('컬럼이 존재하지 않습니다.')

 

일반적으로, in 키워드를 사용하는 방법이 가장 직관적이고 간단하여 널리 사용됩니다.

DataFrame에서 특정 행이 없는 경우에 대처하는 방법은 상황에 따라 다르게 접근할 수 있습니다. 여기에는 몇 가지 일반적인 상황과 해결책을 소개하겠습니다.

 

1. 특정 조건을 만족하는 행이 없는 경우 확인

pandas를 사용하여 특정 조건을 만족하는 행을 필터링할 때, 만약 해당 조건을 만족하는 행이 없다면 결과는 빈 DataFrame이 됩니다. 이 경우 .empty 속성을 사용하여 DataFrame이 비어 있는지 확인할 수 있습니다.

import pandas as pd

# 샘플 데이터 생성
data = {'Name': ['John', 'Anna', 'Peter', 'Linda'],
        'Age': [28, 34, 29, 32],
        'City': ['New York', 'Paris', 'Berlin', 'London']}
df = pd.DataFrame(data)

# 'Age'가 100 이상인 행 필터링
filtered_df = df[df['Age'] >= 100]

# 결과가 비어 있는지 확인
if filtered_df.empty:
    print('조건을 만족하는 행이 없습니다.')
else:
    print(filtered_df)

 

2. 특정 인덱스의 행이 존재하는지 확인

DataFrame에서 특정 인덱스의 행이 존재하는지 확인하려면, in 키워드를 사용하여 인덱스가 DataFrame의 인덱스 목록에 있는지 확인할 수 있습니다.

# 인덱스가 5인 행이 있는지 확인
if 5 in df.index:
    print('인덱스 5의 행이 존재합니다.')
else:
    print('인덱스 5의 행이 존재하지 않습니다.')

 

3. 특정 값이나 조건을 만족하는 행이 존재하는지 확인

any() 함수를 사용하여 DataFrame의 열에 대해 특정 조건을 만족하는 값이 하나라도 있는지 확인할 수 있습니다.

# 'City' 열에 'Seoul'이라는 값이 있는지 확인
if (df['City'] == 'Seoul').any():
    print('Seoul이 City 열에 존재합니다.')
else:
    print('Seoul이 City 열에 존재하지 않습니다.')

 

4. 특정 행이 없을 때 기본값 설정

DataFrame에서 특정 조건을 만족하는 행이 없을 때, 기본값을 설정하거나 대체하는 로직이 필요할 수 있습니다. 이 경우, 빈 DataFrame을 확인한 후 필요한 조치를 취할 수 있습니다.

예를 들어, 특정 조건을 만족하는 행이 없을 경우 새로운 행을 추가할 수 있습니다:

if filtered_df.empty:
    # 조건을 만족하는 행이 없으므로 새 행 추가
    new_row = {'Name': 'Default', 'Age': 0, 'City': 'Unknown'}
    df = df.append(new_row, ignore_index=True)
    print('새로운 행이 추가되었습니다.')
    print(df)

 

이러한 방법을 통해 DataFrame에서 특정 행이 없는 상황을 다룰 수 있으며, 상황에 따라 적절한 조치를 취할 수 있습니다.

Python에서 pandas 라이브러리를 사용하여 DataFrame의 특정 열(column) 값에 따라 데이터를 필터링하는 것은 매우 일반적인 작업입니다. 이를 위해 불리언 인덱싱(Boolean indexing)을 주로 사용합니다. 아래에서는 기본적인 예시를 통해 이 방법을 설명하겠습니다.

 

먼저, pandas가 설치되어 있어야 합니다. 설치되어 있지 않다면, 다음 명령어로 설치할 수 있습니다:

pip install pandas

 

이제, 예를 들어 DataFrame에서 특정 조건을 만족하는 행(row)만 필터링하는 방법을 살펴보겠습니다.

import pandas as pd

# 샘플 데이터 생성
data = {'Name': ['John', 'Anna', 'Peter', 'Linda'],
        'Age': [28, 34, 29, 32],
        'City': ['New York', 'Paris', 'Berlin', 'London']}

df = pd.DataFrame(data)

# 'Age'가 30 이상인 행만 필터링
filtered_df = df[df['Age'] >= 30]

print(filtered_df)

 

이 예시에서는 'Age' 열의 값이 30 이상인 행만 선택하여 filtered_df라는 새로운 DataFrame에 저장합니다.

또한, 여러 조건을 조합하여 필터링할 수도 있습니다. 예를 들어 'Age'가 30 이상이고, 'City'가 'Paris'인 행을 필터링하려면 다음과 같이 작성할 수 있습니다:

# 'Age'가 30 이상이고, 'City'가 'Paris'인 행 필터링
filtered_df = df[(df['Age'] >= 30) & (df['City'] == 'Paris')]

print(filtered_df)

 

이 때, 각 조건을 괄호로 묶고 & (AND) 연산자를 사용하여 두 조건을 모두 만족하는 행을 필터링합니다. 만약 조건 중 하나라도 만족하는 행을 찾고 싶다면, | (OR) 연산자를 사용할 수 있습니다.

이러한 방법을 통해 pandas에서 다양한 조건에 따라 데이터를 효과적으로 필터링할 수 있습니다.

Python에서 Excel 파일을 DataFrame으로 변환하기 위해 pandas 라이브러리를 주로 사용합니다. 이 과정은 매우 간단하며, pandas의 read_excel 함수를 이용하여 수행할 수 있습니다. 다만, Excel 파일을 읽기 위해서는 openpyxl (.xlsx 파일용) 또는 xlrd (.xls 파일용) 같은 추가 라이브러리가 필요할 수 있습니다. 최근 버전의 pandas에서는 .xlsx 파일을 읽기 위해 openpyxl을 추천합니다.

 

먼저 필요한 라이브러리를 설치해야 합니다. 아직 pandas와 openpyxl을 설치하지 않았다면, 다음 명령어를 통해 설치할 수 있습니다:

% pip install pandas openpyxl

# 설치확인
% pip list | grep openpyxl      
openpyxl                      3.0.10
%

 

그 후, Excel 파일을 DataFrame으로 변환하는 과정은 다음과 같습니다:

import pandas as pd

# Excel 파일 경로
file_path = 'path_to_your_excel_file.xlsx'

# Excel 파일을 DataFrame으로 읽기
df = pd.read_excel(file_path)

# DataFrame 확인
print(df)

 

read_excel 함수는 여러 매개변수를 제공하는데, 이를 통해 다양한 요구 사항에 맞게 Excel 파일을 읽을 수 있습니다. 예를 들어, 특정 시트를 읽거나, 열의 범위를 지정하거나, 특정 행을 헤더로 사용하는 등의 설정이 가능합니다.

특정 시트를 읽으려면 sheet_name 매개변수를 사용합니다:

# 'Sheet2'라는 이름의 시트를 읽기
df = pd.read_excel(file_path, sheet_name='Sheet2')

 

sheet_name에 시트의 인덱스를 전달할 수도 있으며, None을 전달하면 모든 시트를 사전 형태로 읽어옵니다.

헤더가 없는 Excel 파일을 읽으려면, header=None을 설정합니다:

# 헤더가 없는 Excel 파일을 읽기
df = pd.read_excel(file_path, header=None)

 

특정 컬럼만 읽으려면 usecols 매개변수에 열 이름이나 열 번호의 범위를 지정합니다:

# A열과 C열만 읽기
df = pd.read_excel(file_path, usecols='A,C')
# 또는 열 번호로 지정(0부터 시작)
df = pd.read_excel(file_path, usecols=[0, 2])

 

이러한 방법을 통해 Python에서 Excel 파일을 쉽게 DataFrame으로 변환하고, pandas를 활용하여 다양한 데이터 분석 작업을 수행할 수 있습니다.

파이썬에서 특정 디렉토리와 그 하위 디렉토리를 포함하여 모든 Excel 파일(예: .xlsx, .xls)을 찾으려면 os 모듈과 glob 모듈을 사용할 수 있습니다. 여기에서는 두 가지 방법을 소개합니다: os 모듈의 walk() 함수를 사용하는 방법과 pathlib 모듈의 Path.rglob() 메서드를 사용하는 방법입니다.

 

첫번째, os.walk()를 사용하는 방법

import os

def find_excel_files(root_dir):
    excel_files = []
    for dirpath, dirnames, filenames in os.walk(root_dir):
        for filename in filenames:
            if filename.endswith(('.xlsx', '.xls')):
                excel_files.append(os.path.join(dirpath, filename))
    return excel_files

# 사용 예
root_directory = 'your_directory_path_here'
excel_files = find_excel_files(root_directory)
for file in excel_files:
    print(file)

 

이 코드는 지정된 루트 디렉토리(root_directory)와 그 하위 디렉토리를 모두 탐색하여 .xlsx 또는 .xls 확장자를 가진 파일의 전체 경로를 리스트로 반환합니다.

 

두번째, pathlib.Path.rglob()를 사용하는 방법

pathlib은 Python 3.4 이상에서 사용할 수 있으며, 파일 시스템 경로를 객체 지향적으로 쉽게 다룰 수 있게 해 줍니다.

from pathlib import Path

def find_excel_files(root_dir):
    excel_files = list(Path(root_dir).rglob('*.xlsx')) + list(Path(root_dir).rglob('*.xls'))
    return [str(file) for file in excel_files]

# 사용 예
root_directory = 'your_directory_path_here'
excel_files = find_excel_files(root_directory)
for file in excel_files:
    print(file)

 

rglob() 메서드는 지정된 패턴과 일치하는 모든 파일의 경로를 재귀적으로 검색합니다. 이 예제에서는 *.xlsx와 *.xls 패턴을 사용하여 Excel 파일을 찾습니다.

두 방법 모두 지정된 디렉토리와 그 하위 디렉토리에서 Excel 파일을 찾는 데 사용할 수 있으며, 사용자의 필요와 선호도에 따라 선택할 수 있습니다.

 

< 참조 >

https://zephyrus1111.tistory.com/460

 

파이썬(Python) 파일과 폴더(디렉토리) 탐색하기 (feat. glob)

파이썬(Python)의 내장 모듈인 glob을 이용하면 파일명의 패턴을 이용하여 특정 폴더와 그 하위에 있는 파일을 찾아낼 수 있다. 이번 포스팅에서는 glob 모듈을 이용하여 특정 패턴을 갖는 파일과 폴

zephyrus1111.tistory.com

https://nck2.github.io/%EC%97%85%EB%AC%B4%EC%9E%90%EB%8F%99%ED%99%94/excelpython/

 

Python으로 특정폴더 내 파일이름 읽기 및 엑셀 내용 읽기

요구사항 파이썬으로 특정폴더안의 파일 이름을 읽는다. 또한 특정 파일의 시트이름을 읽는다. 내용을 읽어와 pandas의 객체로 반환한다.

nck2.github.io

https://dataleader.tistory.com/24

 

[파이썬(python) 이야기 4화] 폴더 내 파일 검색하기, 폴더 내 파일 정보 데이터 프레임으로 저장하

0. 폴더 검색? 프로그램을 개발할 때 종종 폴더를 검색해 파일을 수정하는 경우가 발생합니다. 그러나 파일이 하나일 경우에는 크게 문제가 없지만, 파일이 여러 개일 경우 어떻게 해야할 까요?

dataleader.tistory.com

https://mingchin.tistory.com/168

 

[파이썬/Python] 모든 하위 디렉토리 탐색, 특정 확장자 찾기

특정 경로에 존재하는 모든 하위 디렉토리를 탐색하며 원하는 파일을 찾고자 하는 때가 있다. 이때 활용할 수 있는 것이 os.walk 또는 glob.glob이다. import os for (path, dir, files) in os.walk("D:/"): for filename

mingchin.tistory.com

 

파이썬의 logging 모듈을 사용하여 로그 파일을 일자별로 생성하려면, TimedRotatingFileHandler를 사용하는 것이 좋습니다. 이 핸들러는 지정된 간격에 따라 로그 파일을 새로 만들고, 이전 로그 파일의 이름 뒤에 타임스탬프를 붙여 구분합니다. 일자별 로그 파일 생성을 위한 사용자 정의 로깅 클래스 예시는 다음과 같습니다.

 

import logging
from logging.handlers import TimedRotatingFileHandler
import os

class DailyLogger:
    def __init__(self, name, log_dir='logs', level=logging.DEBUG):
        # 로그 파일 디렉터리 확인 및 생성
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        
        # 로그 파일 경로 설정
        log_file_path = os.path.join(log_dir, f"{name}.log")
        
        # 로거 생성 및 레벨 설정
        self.logger = logging.getLogger(name)
        self.logger.setLevel(level)
        
        # 일자별로 로그 파일을 생성하는 핸들러 설정
        file_handler = TimedRotatingFileHandler(log_file_path, when="midnight", interval=1, backupCount=7)
        file_handler.setLevel(level)
        
        # 로그 포맷 설정
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        file_handler.setFormatter(formatter)
        
        # 핸들러를 로거에 추가
        self.logger.addHandler(file_handler)
        
    def get_logger(self):
        """
        구성된 로거 객체 반환
        """
        return self.logger

 

이 클래스는 로그 파일을 매일 자정에 새로 생성하도록 설정됩니다. backupCount=7은 로그 파일을 최대 7개까지 보관하고, 이를 초과하면 가장 오래된 파일부터 삭제한다는 것을 의미합니다. 로그 디렉터리는 생성자에서 log_dir 인자를 통해 지정할 수 있으며, 기본값은 현재 작업 디렉터리 내의 logs 폴더입니다.

사용 예시는 다음과 같습니다:

# DailyLogger 인스턴스 생성 및 로거 가져오기
daily_logger = DailyLogger(name='MyDailyLogger', log_dir='my_logs', level=logging.INFO).get_logger()

# 로깅 메시지 기록
daily_logger.info('정보 메시지입니다.')

 

이 코드를 실행하면, my_logs 디렉터리 내에 MyDailyLogger.log 파일이 생성되고, 매일 자정마다 새로운 로그 파일로 전환됩니다. 파일 이름은 자동으로 날짜가 추가되어 구분됩니다.

'python > logging' 카테고리의 다른 글

Custom Logger 만들기 1  (0) 2024.03.29
logging 설정하는 방법  (0) 2024.03.14

파이썬에서 로깅(logging)은 애플리케이션의 실행 상태에 대한 정보를 기록하는 중요한 기능입니다. logging 모듈을 사용하면 콘솔, 파일, 웹 서버 등 다양한 대상에 로그를 출력할 수 있습니다. 사용자 정의 로깅 클래스를 만드는 기본적인 예시입니다.

 

먼저, 파이썬의 logging 모듈을 사용하여 로거(logger), 핸들러(handler), 포매터(formatter)를 설정하는 사용자 정의 클래스를 만듭니다. 이 클래스는 로깅을 쉽게 설정하고 사용할 수 있도록 도와줍니다.

 

import logging

class MyLogger:
    def __init__(self, name, level=logging.DEBUG, file_name='app.log'):
        # 로거 생성
        self.logger = logging.getLogger(name)
        self.logger.setLevel(level)  # 로그 레벨 설정
        
        # 파일 핸들러 생성 및 설정
        file_handler = logging.FileHandler(file_name)
        file_handler.setLevel(level)
        
        # 콘솔 핸들러 생성 및 설정
        console_handler = logging.StreamHandler()
        console_handler.setLevel(level)
        
        # 로그 포맷 설정
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        file_handler.setFormatter(formatter)
        console_handler.setFormatter(formatter)
        
        # 핸들러를 로거에 추가
        self.logger.addHandler(file_handler)
        self.logger.addHandler(console_handler)
    
    def get_logger(self):
        """
        구성된 로거 객체 반환
        """
        return self.logger

 

이 클래스를 사용하여 로깅을 설정하고 메시지를 기록하는 방법은 다음과 같습니다:

# MyLogger 인스턴스 생성
my_logger = MyLogger(name='MyAppLogger', level=logging.INFO).get_logger()

# 로깅 메시지 기록
my_logger.debug('디버그 메시지입니다.')
my_logger.info('정보 메시지입니다.')
my_logger.warning('경고 메시지입니다.')
my_logger.error('에러 메시지입니다.')
my_logger.critical('치명적인 에러 메시지입니다.')

 

이 코드는 MyAppLogger라는 이름의 로거를 생성하고, 로그 메시지를 파일(app.log)과 콘솔에 출력합니다. 로그 메시지에는 발생 시간, 로거 이름, 로그 레벨, 메시지가 포함됩니다.

로깅 레벨은 다음과 같은 순서로 정의됩니다: DEBUG < INFO < WARNING < ERROR < CRITICAL. level 파라미터를 통해 설정한 레벨 이상의 메시지만 출력됩니다. 위 예시에서는 level=logging.INFO로 설정했기 때문에, debug 메시지는 출력되지 않습니다.

'python > logging' 카테고리의 다른 글

Custom Logger 만들기 2 (일자별로 log 파일 생성)  (0) 2024.03.29
logging 설정하는 방법  (0) 2024.03.14

+ Recent posts