파이썬에서 파일을 다루는 기본적인 방법에 대해 알아보겠습니다. 파일을 생성, 쓰기, 읽기, 추가하기 등의 작업을 할 수 있으며, 이를 통해 데이터를 영구적으로 저장하고 필요할 때마다 불러와 사용할 수 있습니다.
# 파일을 쓰기 모드로 열어 새 파일 생성
f = open("새파일.txt", 'w')
f.close()
f = open("새파일.txt", 'w')
for i in range(1, 11):
data = "%d번째 줄입니다.\n" % i
f.write(data)
f.close()
파일에서 데이터를 읽는 방법은 여러 가지가 있다:
readline() 함수 사용: 한 번에 한 줄씩 읽는다.
f = open("새파일.txt", 'r')
line = f.readline()
print(line)
f.close()
readlines() 함수 사용: 파일의 모든 줄을 읽어 각 줄을 요소로 갖는 리스트로 반환한다.
f = open("새파일.txt", 'r')
lines = f.readlines()
for line in lines:
print(line.strip()) # strip() 함수로 줄바꿈 문자 제거
f.close()
read() 함수 사용: 파일 내용 전체를 문자열로 반환한다.
python
Copy code
f = open("새파일.txt", 'r')
data = f.read()
print(data)
f.close()
파일 객체를 이용한 반복문 사용: 파일 내용을 줄 단위로 읽어 처리할 수 있다.
f = open("새파일.txt", 'r')
for line in f:
print(line.strip())
f.close()
f = open("새파일.txt", 'a')
for i in range(11, 20):
data = "%d번째 줄입니다.\n" % i
f.write(data)
f.close()
'a' 모드로 파일을 열면, 파일의 끝에 새로운 내용을 추가할 수 있다.
with open("foo.txt", "w") as f:
f.write("Life is too short, you need python")
with 문을 사용하면, 파일을 사용한 작업이 끝난 후 자동으로 파일을 닫아준다. 이는 파일을 닫는 것을 잊을 걱정 없이 코드를 더 깔끔하게 작성할 수 있게 해준다.
C:\python\score_data.txt 파일 생성

이 름 국어 영어 수학 합계 평균
====== ==== ==== ==== ==== ====
홍길동 100 90 80 270 90
신길동 90 70 60 220 73 ⇐ 평균은 반올림
고길동 60 100 20 180 60
# 점수 데이터 파일을 오픈
with open('score_data.txt', 'r', encoding='utf-8') as file:
# 타이틀을 출력
# 파일을 행 단위로 읽어서 처리
for line in file:
# 개행문자를 제거
# 공백문자를 기준으로 분리
# 이름을 추출
# 점수를 추출
# 합계를 계산
# 평균을 계산
# 이름, 점수, 합계, 평균을 출력
# 점수 데이터 파일을 오픈
with open('score_data.txt', 'r', encoding='utf-8') as file:
# 타이틀을 출력
print('====== ==== ==== ==== ==== ====')
print('이 름 국어 영어 수학 합계 평균')
print('====== ==== ==== ==== ==== ====')
# 파일을 행 단위로 읽어서 처리
for line in file:
# 개행문자를 제거
line = line.strip()
# 공백문자를 기준으로 분리
datas = line.split()
# 이름을 추출
name = datas[0]
# 점수를 추출
scores = datas[1:]
# 합계를 계산
sum = 0
for score in scores:
sum += int(score)
# 평균을 계산
average = int(sum / len(scores))
# 이름, 점수, 합계, 평균을 출력
print(f"{name:3}", end=" ")
for score in scores:
print(f"{int(score):4}", end=" ")
print(f"{sum:4}", end=" ")
print(f"{average:4}")
# 리스트에 들어 있는 모든 정수의 합을 계산해서 반환하는 함수
def calurate_sum(scores):
sum = 0
for score in scores:
sum += int(score)
return sum
# 리스트에 들어 있는 모든 정수의 평균을 계산해서 반환하는 함수
def calurate_average(scores):
return int(calurate_sum(scores) / len(scores))
def print_title():
print('====== ==== ==== ==== ==== ====')
print('이 름 국어 영어 수학 합계 평균')
print('====== ==== ==== ==== ==== ====')
def print_data(name, scores, sum, average):
print(f"{name:3}", end=" ")
for score in scores:
print(f"{int(score):4}", end=" ")
print(f"{sum:4}", end=" ")
print(f"{average:4}")
# 점수 데이터 파일을 오픈
with open('score_data.txt', 'r', encoding='utf-8') as file:
# 타이틀을 출력 ==> 함수로 대체
# print('====== ==== ==== ==== ==== ====')
# print('이 름 국어 영어 수학 합계 평균')
# print('====== ==== ==== ==== ==== ====')
print_title()
# 파일을 행 단위로 읽어서 처리
for line in file:
# 개행문자를 제거
line = line.strip()
# 공백문자를 기준으로 분리
datas = line.split()
# 이름을 추출
name = datas[0]
# 점수를 추출
scores = datas[1:]
# 합계를 계산 ==> 함수로 대체
# sum = 0
# for score in scores:
# sum += int(score)
sum = calurate_sum(scores)
# 평균을 계산 ==> 함수로 대체
#average = int(sum / len(scores))
average = calurate_average(scores)
# 이름, 점수, 합계, 평균을 출력 ==> 함수로 대체
# print(f"{name:3}", end=" ")
# for score in scores:
# print(f"{int(score):4}", end=" ")
# print(f"{sum:4}", end=" ")
# print(f"{average:4}")
print_data(name, scores, sum, average)
def calurate_sum(scores):
sum = 0
for score in scores:
sum += int(score)
return sum
def calurate_average(scores):
return int(calurate_sum(scores) / len(scores))
def print_title():
print('====== ==== ==== ==== ==== ====')
print('이 름 국어 영어 수학 합계 평균')
print('====== ==== ==== ==== ==== ====')
def print_data(name, scores, sum, average):
print(f"{name:3}", end=" ")
for score in scores:
print(f"{int(score):4}", end=" ")
print(f"{sum:4}", end=" ")
print(f"{average:4}")
with open('score_data.txt', 'r', encoding='utf-8') as file:
print_title()
for line in file:
line = line.strip()
datas = line.split()
name = datas[0]
scores = datas[1:]
sum = calurate_sum(scores)
average = calurate_average(scores)
print_data(name, scores, sum, average)
def calurate_sum(scores):
sum = 0
for score in scores:
sum += int(score)
return sum
def calurate_average(scores):
return int(calurate_sum(scores) / len(scores))
def print_title():
# print('====== ==== ==== ==== ==== ====')
# print('이 름 국어 영어 수학 합계 평균')
# print('====== ==== ==== ==== ==== ====')
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
print('이 름 국어 영어 수학 합계 평균')
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
def print_tail():
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
def print_data(name, scores, sum, average):
print(f"{name:3}", end=" ")
for score in scores:
print(f"{int(score):4}", end=" ")
print(f"{sum:4}", end=" ")
print(f"{average:4}")
with open('score_data.txt', 'r', encoding='utf-8') as file:
print_title()
for line in file:
line = line.strip()
datas = line.split()
name = datas[0]
scores = datas[1:]
sum = calurate_sum(scores)
average = calurate_average(scores)
print_data(name, scores, sum, average)
print_tail()
====== ==== ==== ==== ==== ====
이 름 국어 영어 수학 합계 평균
====== ==== ==== ==== ==== ====
홍길동 100 90 80 270 90
신길동 90 70 60 220 73
고길동 60 100 20 180 60
====== ==== ==== ==== ==== ====
# 파일 생성하기
f = open("새파일.txt", 'w')
f.close()
파일 열기 모드
'r': 읽기 모드
'w': 쓰기 모드
'a': 추가 모드
'w' 모드로 파일을 열 경우, 해당 파일이 이미 존재하면 내용이 모두 사라지고, 존재하지 않으면 새 파일이 생성된다.
파일을 쓰기 모드로 열고, write 메소드를 사용해 파일에 데이터를 쓸 수 있다.
f = open("새파일.txt", 'w')
for i in range(1, 11):
data = f"{i}번째 줄입니다.\n"
f.write(data)
f.close()
파일에서 데이터를 읽는 방법은 여러 가지가 있다.
readline() 함수: 파일의 첫 번째 줄을 읽어 출력
readlines() 함수: 파일의 모든 줄을 읽어 각 줄을 요소로 하는 리스트로 반환
read() 함수: 파일 내용 전체를 문자열로 반환
파일 객체를 이용: 파일 객체를 for 문과 함께 사용하여 파일의 내용을 줄 단위로 읽음
# readline() 예시
f = open("새파일.txt", 'r')
line = f.readline()
print(line)
f.close()
# readlines() 예시
f = open("새파일.txt", 'r')
lines = f.readlines()
for line in lines:
print(line.strip()) # 줄바꿈 문자 제거
f.close()
# read() 예시
f = open("새파일.txt", 'r')
data = f.read()
print(data)
f.close()
파일의 내용을 유지하면서 새로운 내용을 추가하려면 파일을 추가 모드('a')로 연다.
f = open("새파일.txt", 'a')
for i in range(11, 20):
data = f"{i}번째 줄입니다.\n"
f.write(data)
f.close()
with 문을 사용하면 파일을 자동으로 닫아주기 때문에 close() 메소드를 명시적으로 호출할 필요가 없다. 이 방법은 파일 작업을 더 안전하게 만들어 준다.
with open("새파일.txt", "w") as f:
f.write("Life is too short, you need python")
실행 예)
python test.py "This is sample program"
입력 ⇒ This is sample program
T => 1
h => 1
i => 2
s => 3
:
import sys
sentence = sys.argv[1]
print(f"입력 => {sentence}")
# 글자(키)와 글자의 사용 회수(값)를 가지는 딕셔너리
char_count = dict()
# 입력받은 문장에서 한 글자씩을 추출해서 딕셔너리에 추가
for char in sentence:
# 딕셔너리에 해당 글자가 존재하는 경우, 사용 회수를 증가
if char in char_count:
char_count[char] = char_count[char] + 1
# 딕셔너리에 해당 글자가 존재하지 않는 경우, 사용 회수로 1을 설정해서 추가
else:
char_count[char] = 1
# 딕셔너리를 순회하면서 출력
for char in char_count:
print(f"{char} => {char_count[char]}")
PS C:\python> python test.py "This is sample program"
입력 => This is sample program
T => 1
h => 1
i => 2
s => 3
=> 3
a => 2
m => 2
p => 2
l => 1
e => 1
r => 2
o => 1
g => 1
PS C:\python> python test.py "T & t is sampe char."
입력 => T & t is sampe char.
a => 2
c => 1
:
i => 1
s => 1
t => 2
import sys
sentence = sys.argv[1]
print(f"입력 => {sentence}")
char_count = dict()
for char in sentence:
# 알파벳을 소문자로 변경
char = char.lower()
# 알파벳이 아닌 경우 다음 글자를 처리
if char < 'a' or char > 'z':
continue
if char in char_count: char_count[char] = char_count[char] + 1
else: char_count[char] = 1
# 알파벳(키)를 기준으로 정렬한 결과를 출력
for key in sorted(char_count.keys()):
print(f"{key} => {char_count[key]}")
PS C:\python> python test.py "T & t is sampe char."
입력 => T & t is sampe char.
a => 2
c => 1
e => 1
h => 1
i => 1
m => 1
p => 1
r => 1
s => 2
t => 2
import sys
# 문자열 예시
sentence = "T & t is same alphabet."
print(f"입력 => {sentence}")
char_count = {}
# 문자열을 순회하며 알파벳의 빈도를 계산
for char in sentence:
char = char.lower()
if char.isalpha():
if char in char_count:
char_count[char] += 1
else:
char_count[char] = 1
# 빈도수별로 알파벳을 분류
frequency = {}
for char, count in char_count.items():
if count in frequency:
frequency[count].append(char)
else:
frequency[count] = [char]
# 빈도수를 기준으로 내림차순 정렬
sorted_freq = sorted(frequency.items(), key=lambda x: x[0], reverse=True)
# 결과 출력
for count, chars in sorted_freq:
print(f"{count} => {sorted(chars)}")
실습. 위의 프로그램을 가장 많이 나온 알파벳 순으로 출력하도록 수정
PS C:\python> python test.py "T & t is same alphabet."
입력 => T & t is same alphabet.
3 => [ 'a', 't' ]
2 => [ 'e', 's' ]
1 => [ 'b', 'h', 'i', 'l', 'm' ]
import sys
sentence = sys.argv[1]
print(f"입력 => {sentence}")
char_count = dict()
for char in sentence:
char = char.lower()
if char < 'a' or char > 'z':
continue
if char in char_count: char_count[char] = char_count[char] + 1
else: char_count[char] = 1
# 회수(숫자)를 키로 가지고, 문자 리스트를 값으로 가지는 딕셔너리를 정의
# { 3: ['a', 'b', 'c'], 2: ['x', 'y'] }
count_char = {}
for char in sorted(char_count.keys()):
count = char_count[char]
if count in count_char: count_char[count].append(char)
else: count_char[count] = [char]
# 회수(키) 내림차순으로 정렬해서 출력
for key in sorted(count_char.keys(), reverse=True):
print(f"{key} => {count_char[key]}")
import re
import random
#words = input('여러 단어로 구성된 문장을 입력하세요. ')
words = "Visit BBC for trusted reporting on the latest world and US news, sports, business, climate, innovation, culture and much more."
print(f"입력 : {words}")
# 문장부호를 제거 ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~ \
words = re.sub(r'[!"#$%&\'()*+,-./:;<=>?@\[\]^_\`{|}~\\\\]', '', words)
# 공백문자를 기준으로 단어를 분리
words = words.split()
# 임의의 단어를 추출
rand_word = list(words[random.randrange(len(words))])
# 화면에 출력할 내용
disp_word = list('_' * len(rand_word))
print(f'힌트 >>> {''.join(disp_word)}')
try_count = 0
while True:
try_count += 1
alpha = input(f'{try_count} 시도 >>> 영어 단어를 구성하는 알파벳을 입력하세요. ')
for i, a in enumerate(rand_word):
if alpha == a:
disp_word[i] = alpha
print(f'힌트 >>> {''.join(disp_word)}')
if disp_word.count('_') == 0:
print(f'정답 "{''.join(rand_word)}"를 {try_count}번 만에 맞췄습니다.')
break
elif try_count >= 10:
print(f'10번에 기회가 모두 끝났습니다. 정답은 "{''.join(rand_word)}" 입니다.')
break
def calurate_sum(scores):
sum = 0
for score in scores:
sum += int(score)
return sum
def calurate_average(scores):
return int(calurate_sum(scores) / len(scores))
def print_title():
# print('====== ==== ==== ==== ==== ====')
# print('이 름 국어 영어 수학 합계 평균')
# print('====== ==== ==== ==== ==== ====')
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
print('이 름 국어 영어 수학 합계 평균')
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
def print_tail():
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
def print_data(name, scores, sum, average):
print(f"{name:3}", end=" ")
for score in scores:
print(f"{int(score):4}", end=" ")
print(f"{sum:4}", end=" ")
print(f"{average:4}")
with open('score_data.txt', 'r', encoding='utf-8') as file:
print_title()
for line in file:
line = line.strip()
datas = line.split()
name = datas[0]
scores = datas[1:]
sum = calurate_sum(scores)
average = calurate_average(scores)
print_data(name, scores, sum, average)
print_tail()
import sys
sentence = sys.argv[1]
print(f"입력 => {sentence}")
char_count = dict()
for char in sentence:
char = char.lower()
if char < 'a' or char > 'z':
continue
if char in char_count: char_count[char] = char_count[char] + 1
else: char_count[char] = 1
# 회수(숫자)를 키로 가지고, 문자 리스트를 값으로 가지는 딕셔너리를 정의
# { 3: ['a', 'b', 'c'], 2: ['x', 'y'] }
count_char = {}
for char in sorted(char_count.keys()):
count = char_count[char]
if count in count_char: count_char[count].append(char)
else: count_char[count] = [char]
# 회수(키) 내림차순으로 정렬해서 출력
for key in sorted(count_char.keys(), reverse=True):
print(f"{key} => {count_char[key]}")
c:\python\main.py
=================
1. 행맨
2. 점수계산
3. 알파벳 카운터
실행할 프로그램의 번호를 입력하세요. : 1
def show_menu():
print("""
=================
1. 행맨
2. 점수계산
3. 알파벳 카운터
Q. 종료
=================
""")
while True:
show_menu()
menu = input("실행할 프로그램의 번호를 입력하세요. : ")
if menu == 'Q':
print("프로그램을 종료합니다.")
break
menu = int(menu)
if menu == 1:
print("행맨 실행")
elif menu == 2:
print("점수 계산 실행")
elif menu == 3:
print("알파벳 카운트 실행")
else:
print("잘못된 입력입니다. 다시 시도해 주세요.")
import re
import random
def main(): #main() 함수를 호출해야 실행되도록 수정
#words = input('여러 단어로 구성된 문장을 입력하세요. ')
words = "Visit BBC for trusted reporting on the latest world and US news, sports, business, climate, innovation, culture and much more."
print(f"입력 : {words}")
# 문장부호를 제거 ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~ \
words = re.sub(r'[!"#$%&\'()*+,-./:;<=>?@\[\]^_\`{|}~\\\\]', '', words)
# 공백문자를 기준으로 단어를 분리
words = words.split()
# 임의의 단어를 추출
rand_word = list(words[random.randrange(len(words))])
# 화면에 출력할 내용
disp_word = list('_' * len(rand_word))
print(f'힌트 >>> {''.join(disp_word)}')
try_count = 0
while True:
try_count += 1
alpha = input(f'{try_count} 시도 >>> 영어 단어를 구성하는 알파벳을 입력하세요. ')
for i, a in enumerate(rand_word):
if alpha == a:
disp_word[i] = alpha
print(f'힌트 >>> {''.join(disp_word)}')
if disp_word.count('_') == 0:
print(f'정답 "{''.join(rand_word)}"를 {try_count}번 만에 맞췄습니다.')
break
elif try_count >= 10:
print(f'10번에 기회가 모두 끝났습니다. 정답은 "{''.join(rand_word)}" 입니다.')
break
if __name__ == '__main__': #모듈 import 시에는 실행되지 않도록 제한
main() #모듈을 직접 실행했을 때만 실행
import hangman #행맨 모듈을 (사용하기 위해서) 추가
def show_menu():
print("""
=================
1. 행맨
2. 점수계산
3. 알파벳 카운터
Q. 종료
=================
""")
while True:
show_menu()
menu = input("실행할 프로그램의 번호를 입력하세요. : ")
if menu == 'Q':
print("프로그램을 종료합니다.")
break
menu = int(menu)
if menu == 1:
print("행맨 실행")
hangman.main() #행맨 모듈의 실행 함수를 호출
elif menu == 2:
print("점수 계산 실행")
elif menu == 3:
print("알파벳 카운트 실행")
else:
print("잘못된 입력입니다. 다시 시도해 주세요.")
def calurate_sum(scores):
sum = 0
for score in scores:
sum += int(score)
return sum
def calurate_average(scores):
return int(calurate_sum(scores) / len(scores))
def print_title():
# print('====== ==== ==== ==== ==== ====')
# print('이 름 국어 영어 수학 합계 평균')
# print('====== ==== ==== ==== ==== ====')
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
print('이 름 국어 영어 수학 합계 평균')
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
def print_tail():
print(f'{"="*6} {"="*4} {"="*4} {"="*4} {"="*4} {"="*4}')
def print_data(name, scores, sum, average):
print(f"{name:3}", end=" ")
for score in scores:
print(f"{int(score):4}", end=" ")
print(f"{sum:4}", end=" ")
print(f"{average:4}")
def main():
with open('score_data.txt', 'r', encoding='utf-8') as file:
print_title()
for line in file:
line = line.strip()
datas = line.split()
name = datas[0]
scores = datas[1:]
sum = calurate_sum(scores)
average = calurate_average(scores)
print_data(name, scores, sum, average)
print_tail()
if __name__ == '__main__':
main()
import sys
def main():
# sentence = sys.argv[1]
sentence = input("문장을 입력하세요. ")
print(f"입력 => {sentence}")
char_count = dict()
for char in sentence:
char = char.lower()
if char < 'a' or char > 'z':
continue
if char in char_count: char_count[char] = char_count[char] + 1
else: char_count[char] = 1
count_char = {}
for char in sorted(char_count.keys()):
count = char_count[char]
if count in count_char: count_char[count].append(char)
else: count_char[count] = [char]
for key in sorted(count_char.keys(), reverse=True):
print(f"{key} => {count_char[key]}")
if __name__ == '__main__':
main()
import hangman
import score
import counter
def show_menu():
print("""
=================
1. 행맨
2. 점수계산
3. 알파벳 카운터
Q. 종료
=================
""")
while True:
show_menu()
menu = input("실행할 프로그램의 번호를 입력하세요. : ")
if menu == 'Q':
print("프로그램을 종료합니다.")
break
menu = int(menu)
if menu == 1:
print("행맨 실행 ...")
hangman.main()
elif menu == 2:
print("점수 계산 실행 ...")
score.main()
elif menu == 3:
print("알파벳 카운트 실행 ...")
counter.main()
else:
print("잘못된 입력입니다. 다시 시도해 주세요.")
클래스는 객체를 생성하기 위한 템플릿이다. 클래스에는 객체의 기본적인 구조와 동작을 정의한다. 예를 들어, Calculator 클래스는 계산기 객체의 구조와 계산기가 수행할 수 있는 연산들을 정의한다.
class Calculator:
def __init__(self): # 생성자
self.result = 0 # 인스턴스 변수 초기화
def add(self, num): # 메서드
self.result += num
return self.result
def sub(self, num):
self.result -= num
return self.result
cal1 = Calculator() # 객체 생성
print(cal1.add(3)) # 객체의 메서드 호출
print(cal1.sub(1)) # 다른 메서드 호출
Calculator()는 Calculator 클래스의 인스턴스(객체)를 생성한다.
생성된 객체를 통해 정의된 메서드를 호출할 수 있다.
class Calculator:
def __init__(self, first, second): # 생성자에 파라미터 추가
self.first = first
self.second = second
def add(self):
return self.first + self.second
def sub(self):
return self.first - self.second
# mul, div 메서드 추가
사칙 연산을 수행하는 메서드를 추가하여 클래스를 확장할 수 있다.
객체가 생성될 때 자동으로 호출되는 특별한 메서드인 생성자를 통해 인스턴스 변수를 초기화할 수 있다.
생성자는 객체의 초기 상태를 설정하는 데 사용된다.
클래스는 데이터와 이를 조작하는 메서드를 함께 묶어 관리한다. 이는 코드의 재사용성을 높이고, 관리를 용이하게 한다.
def div(self):
if self.second == 0:
return 0 # 0으로 나누는 경우의 처리
return self.first / self.second
메서드 내에서 오류 상황(예: 0으로 나누기)을 처리하여 프로그램의 안정성을 높일 수 있다.
시계 클래스를 구현
import time
class Clock:
def __init__(self) -> None:
self.hour = 0
self.miniute = 0
self.second = 0
def print(self):
print(f"{self.hour}:{self.miniute}:{self.second}")
def add_one_hour(self):
self.hour += 1
if self.hour >= 24:
self.hour = 0
def add_one_minute(self):
self.miniute += 1
if self.miniute >= 60:
self.miniute = 0
self.add_one_hour()
def add_one_second(self):
self.second += 1
if self.second >= 60:
self.second = 0
self.add_one_minute()
c = Clock()
while True:
c.add_one_second()
c.print()
# time.sleep(1)