랭체인 1주차 수업에 앞서 파이썬 과제부터 시작해 봤습니다.
코드는 문자 그대로 읽고, 모르는 코드 검색해서 추가하고, 변수 및 경로 설정 하는 수준이 전부입니다.
그래서 챗선생, 클3선생에게 의지하며 챗선생 위주로 물어보다 안되면 코드 받아서 클3선생에게 물어봐서 해결하는 과정을 진행했습니다. (딸깍 만 했네요 ㅜ)
문제를 넣으면 코드를 작성해주었고, 실행시키고 에러가 뜨면 다시 카피해서 클선생에게 물어보는 과정으로 진행했습니다.
추가적으로 답변 예시까지 함께 넣어서 물어보니, 답변 예시의 형태에 맞춰 결과값이 나오도록 코드를 작성해주니 좋더라고요~!
아래 코드는 궁금하진 않으시겠지만, ‘인증’ 차원으로 넣어봤습니다.
초보자들도 저와 함께 포기말고 끝까지 완주 하시길 응원하겠습니다~!!!
파이썬 1-1. 기본 입출력 및 조건문 활용
def check_even_odd(number):
if number % 2 == 0:
return "짝수입니다."
else:
return "홀수입니다."
# 사용자로부터 숫자를 입력받습니다.
try:
user_input = int(input("숫자를 입력하세요: "))
result = check_even_odd(user_input)
print(f"입력한 숫자 {user_input}는 {result}")
except ValueError:
print("유효한 숫자를 입력하세요.")
파이썬 1-2. 리스트와 반복문을 활용한 데이터 처리
def calculate_average(numbers):
total = sum(numbers)
average = total / len(numbers)
return total, average
# 사용자로부터 5개의 숫자를 입력받아 리스트에 저장합니다.
numbers = []
for i in range(5):
while True:
try:
num = float(input(f"{i + 1}번째 숫자를 입력하세요: "))
numbers.append(num)
break
except ValueError:
print("유효한 숫자를 입력하세요.")
# 합계와 평균을 계산합니다.
total, average = calculate_average(numbers)
# 결과를 출력합니다.
print(f"입력한 5개의 숫자: {numbers}")
print(f"합계: {total}")
print(f"평균: {average}")
파이썬 1-3. 파일 입출력
# 파일을 읽고 특정 단어를 다른 단어로 바꾸는 프로그램
# 원본 파일명과 수정된 파일명을 정의합니다.
input_filename = 'example_text.txt'
output_filename = 'modified_text.txt'
# 파일을 읽어들입니다.
with open('example_text.txt', 'r', encoding='utf-8') as file:
text = file.read()
# 단어를 교체합니다.
modified_text = text.replace('burdens', 'brightens').replace('weariness', 'greatness')
# 수정된 내용을 새로운 파일에 저장합니다.
with open(output_filename, 'w', encoding='utf-8') as file:
file.write(modified_text)
print(f"파일 '{input_filename}'의 내용이 수정되어 '{output_filename}'에 저장되었습니다.")
파이썬 1-4. 파일 입출력과 반복문, 조건문 복합 사용하기
import zipfile
import os
# files.zip 파일의 압축을 해제할 폴더 경로를 지정합니다.
zip_file_path = 'files.zip'
extract_folder = 'extracted_files'
# 압축 파일을 해제합니다.
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
zip_ref.extractall(extract_folder)
# 아라비아 숫자를 찾기 위한 파일들을 처리합니다.
arabic_numbers = []
# 추출된 폴더를 순회하며 파일을 읽습니다.
for root, dirs, files in os.walk(extract_folder):
for file_name in files:
file_path = os.path.join(root, file_name)
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read().strip()
# 아라비아 숫자인지 확인합니다.
if content.isdigit():
arabic_numbers.append(int(content))
# 아라비아 숫자들의 평균을 계산합니다.
if arabic_numbers:
average_value = sum(arabic_numbers) / len(arabic_numbers)
# 결과를 result.txt에 저장합니다.
result_file_path = 'result.txt'
with open(result_file_path, 'w', encoding='utf-8') as result_file:
result_file.write(str(average_value))
# result.txt 파일의 내용을 읽고 출력합니다.
with open(result_file_path, 'r', encoding='utf-8') as result_file:
result_content = result_file.read()
print(f"result.txt 파일의 내용: {result_content}")
else:
print("아라비아 숫자가 포함된 파일이 없습니다.")
파이썬 2-1. 외부 라이브러리 설치 및 엑셀 입출력
import zipfile
import os
import pandas as pd
# 압축 파일의 경로와 압축 해제할 폴더 경로를 지정합니다.
zip_file_path = 'excel_files.zip'
extract_folder = 'extracted_excel_files'
result_file_path = 'result.xlsx'
# 압축 파일을 해제합니다.
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
zip_ref.extractall(extract_folder)
# 모든 파일의 데이터를 저장할 리스트를 초기화합니다.
data_frames = []
# 추출된 폴더를 순회하며 엑셀 파일을 읽습니다.
for idx, file_name in enumerate(sorted(os.listdir(extract_folder))):
if file_name.endswith('.xlsx'):
file_path = os.path.join(extract_folder, file_name)
try:
df = pd.read_excel(file_path, engine='openpyxl')
# '표1', '표2', ... 형식으로 열 이름을 추가합니다.
new_columns = {col: f'표{idx + 1}_{col}' for col in df.columns}
df.rename(columns=new_columns, inplace=True)
data_frames.append(df)
except Exception as e:
print(f"파일을 읽는 중 오류 발생: {file_path}, 오류: {e}")
# 최대 행 수를 결정합니다.
max_rows = max(df.shape[0] for df in data_frames)
# 모든 데이터를 하나의 데이터프레임으로 결합합니다.
result_df = pd.DataFrame()
# 각 데이터프레임을 결합합니다.
for df in data_frames:
# 현재 데이터프레임의 행 수를 가져옵니다.
num_rows = df.shape[0]
# 최대 행 수에 맞춰 빈 행을 추가합니다.
if num_rows < max_rows:
empty_rows = pd.DataFrame(index=range(max_rows - num_rows), columns=df.columns)
df = pd.concat([df, empty_rows], ignore_index=True)
# 결과 데이터프레임에 결합합니다.
result_df = pd.concat([result_df, df], axis=1)
# 각 데이터프레임 사이에 빈 컬럼을 추가합니다.
empty_column = pd.DataFrame(index=range(max_rows), columns=[f'빈 컬럼{len(result_df.columns)}'])
result_df = pd.concat([result_df, empty_column], axis=1)
# 마지막 빈 컬럼을 제거합니다.
result_df = result_df.iloc[:, :-1]
# 결과 데이터프레임을 result.xlsx 파일에 저장합니다.
result_df.to_excel(result_file_path, index=False, engine='openpyxl')
print(f"결과가 {result_file_path} 파일에 저장되었습니다.")
파이썬 2-2. 웹 크롤링을 이용한 날씨 정보 가져오기
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 각 도시의 URL을 딕셔너리로 정의합니다.
cities = {
'서울': 'https://weather.com/weather/today/l/KSXX0037:1:KS',
'도쿄': 'https://weather.com/weather/today/l/JAXX0085:1:JA',
'홍콩': 'https://weather.com/weather/today/l/a16033779bee84d744ad8c017c2db67cfce767078b737139ec37e3bdab778110',
'뉴욕': 'https://weather.com/weather/today/l/USNY0996:1:US'
}
# 날씨 정보를 저장할 리스트 초기화
weather_data = []
# 각 도시의 날씨 정보를 크롤링
for city, url in cities.items():
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(response.content, 'html.parser')
# 날씨 정보를 파싱 (Weather.com의 HTML 구조에 맞게 적절히 변경 필요)
try:
temperature = soup.find('span', class_='CurrentConditions--tempValue--MHmYY').text
condition = soup.find('div', class_='CurrentConditions--phraseValue--mZC_p').text
# 온도를 섭씨로 변환
if '°' in temperature:
temperature_f = float(temperature.replace('°', ''))
temperature_c = (temperature_f - 32) * 5.0/9.0
temperature = f"{temperature_c:.1f}°C"
elif '°C' in temperature:
temperature = temperature.replace('°C', '°C')
except AttributeError:
temperature = 'N/A'
condition = 'N/A'
weather_data.append({
'도시': city,
'온도': temperature,
'상태': condition
})
print(f"{city}: {temperature}, {condition}")
# 데이터를 데이터프레임으로 변환
df = pd.DataFrame(weather_data)
# 엑셀 파일로 저장
output_file = 'weather.xlsx'
df.to_excel(output_file, index=False, engine='openpyxl')
print("-----------------")
print("국가별 날씨 저장 완료!")
파이썬 2-3. 뉴욕타임즈 헤드라인 크롤링
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import pandas as pd
import time
# 크롬 드라이버 설정
options = webdriver.ChromeOptions()
options.add_argument("--headless") # 브라우저 창을 띄우지 않음
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
# 검색어를 포함한 URL로 직접 이동
search_keyword = "ai"
search_url = f"https://www.nytimes.com/search?query={search_keyword}"
driver.get(search_url)
# 검색 결과 페이지 로드 대기
time.sleep(5) # 검색 결과가 로드될 때까지 충분히 대기
# 검색 결과 중 상위 10개의 헤드라인 추출
headlines = []
try:
# 검색 결과 컨테이너 요소 찾기
search_results = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'ol[data-testid="search-results"]'))
)
# 검색 결과 아티클 요소들 찾기
articles = search_results.find_elements(By.CSS_SELECTOR, 'li[data-testid="search-bodega-result"]')[:10]
for article in articles:
headline = article.find_element(By.CSS_SELECTOR, 'h4').text
headlines.append(headline)
except Exception as e:
print(f"검색 결과를 찾는 중 오류 발생: {e}")
# 크롬 드라이버 종료
driver.quit()
# 헤드라인 출력
print("[AI 관련 뉴욕타임즈 헤드라인]")
for idx, headline in enumerate(headlines, 1):
print(f"{idx}. {headline}")
print("-----------------")
print("헤드라인 저장 완료!")
# 헤드라인을 데이터프레임으로 변환
df = pd.DataFrame(headlines, columns=["헤드라인"])
# 엑셀 파일로 저장
df.to_excel("nyt_headlines.xlsx", index=False, engine='openpyxl')
파이썬 3-1. GPT-3.5 API를 활용한 끝말잇기 게임 제작
import openai
import os
# OpenAI API 키 설정 (환경 변수로 설정하거나 직접 입력)
openai.api_key = os.getenv('OPENAI_API_KEY')
def get_next_word(word):
# 입력된 단어의 마지막 글자 추출
last_char = word[-1]
# GPT-3.5 API 호출하여 끝말잇기 단어 요청
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "너는 끝말잇기 게임을 도와주는 AI야."},
{"role": "user", "content": f"끝말잇기를 해봅시다. '{last_char}'로 시작하는 단어를 말해줘."},
]
)
# 응답에서 단어 추출
next_word = response.choices[0].message['content'].strip()
return next_word
def main():
while True:
user_input = input("단어를 입력하세요: ")
if user_input == '그만':
print("게임을 종료합니다.")
break
next_word = get_next_word(user_input)
print(f"AI가 제시한 단어: {next_word}")
if __name__ == "__main__":
main()
파이썬 3-2. GPT-3.5 API로 텍스트 파일 번역
import openai
import os
# OpenAI API 키 설정 (환경 변수로 설정하거나 직접 입력)
openai.api_key = os.getenv('OPENAI_API_KEY')
def translate_text(text, target_language):
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a translation assistant."},
{"role": "user", "content": f"Translate the following text to {target_language}: {text}"},
]
)
translated_text = response.choices[0].message['content'].strip()
return translated_text
def main():
# 사용자 입력 받기
original_text = input("원본 텍스트를 입력하세요: ")
target_language = input("타겟 언어를 입력하세요: ")
# 텍스트 번역
translated_text = translate_text(original_text, target_language)
print(f"번역 결과: {translated_text}")
if __name__ == "__main__":
main()
#11기 랭체인