랭체인 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기 랭체인