TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 기초>

[파이썬] 파이썬 기초: 파일 읽고 쓰기 (보완)

by 기록자_Recordian 2025. 1. 16.
728x90
반응형
이전 내용
 

[파이썬] 파이썬기초: 입력과 출력, 파일 읽고 쓰기

시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.사용자 입력 사용자

puppy-foot-it.tistory.com


파일 읽고 쓰기

 

◆ 작업 폴더의 경로 알아보기

os 모듈을 import 한 뒤, os.getcwd()를 하면 작업 폴더의 경로를 알 수 있다.

import os
print("현재 작업 경로(디렉토리)는", os.getcwd(), "입니다.")

 

[os 모듈]

 

[파이썬] os(Operating System) 모듈이란?

다양한 기능을 제공하는 os 모듈 파이썬에는 기본적으로 제공되는 다양한 모듈이 있다. 이러한 모듈은 모두 유용하게 사용되지만 자주 사용되는 모듈 가운데 os라는 모듈이 있다. os 모듈은 Operat

puppy-foot-it.tistory.com

 

◆ 새로운 파일 생성하고 내용 쓰기

open() 함수를 사용해 모드 (w: 쓰기, r: 읽기, a: 이어쓰기)를 설정하고, 한글의 경우 encoding='utf-8' 설정

작업이 완료된 후에는 close()로 닫기

f = open("files/새파일.txt", "w", encoding="utf-8")
print("생성된 파일은 -----")
print(f)

for i in range(1, 6):
    data = '%d번째 줄입니다.\n' %i
    f.write(data)
f.close()

파일 내용을 읽는 여러가지 방법

 

◆ 전체 읽기1: readline()

readline()은 해당 파일을 한 줄씩 읽어올 수 있다.

while문을 사용하여 전체 내용을 출력할 수 있다.

f = open("files/새파일.txt", "r", encoding="utf-8")
print("#### readline()은 파일의 내용을 한 줄씩 읽어옴")
while True:
    line = f.readline()
    if line:
        print(line.rstrip()) # 엔터 제거
    else:
        break
f.close()

 

◆ 전체 읽기2: readlines()

readlines()는 한 번에 여러 줄을 읽어올 수 있다.

for문을 사용하여 한 줄씩 출력되게 할 수 있다.

f = open("files/새파일.txt", "r", encoding="utf-8")
print("#### readlines()은 파일의 내용을 여러줄 씩 읽어옴")
lines = f.readlines()
# print(lines) # readlines는 리스트로 묶어줌
for line in lines:
    print(line.rstrip())
f.close()

 

◆ 전체 읽기3: read()

read()를 사용하면 한 번에 전체를 읽어올 수 있다.

f = open("files/새파일.txt", "r", encoding="utf-8")
print("### read()를 사용하면 전체 읽기를 할 수 있다. ###")
data = f.read()
print(data) # read는 문자열로 반환
f.close()

 

◆ 전체 읽기4: read(1)

read(1)을 사용하면 한 글자씩 읽을 수 있다.

while문을 사용하여 한 줄에 한 글자씩 출력되게 할 수 있다.

f = open("files/새파일.txt", "r", encoding="utf-8")
print("### read(1)을 사용하면 한 글자씩 읽기를 할 수 있다. ###")
ch = f.read(1)
while ch:
    print(ch)
    ch = f.read(1)
f.close()

자원을 자동으로 반납하는 with()문

 

with문을 사용하게 되면 앞의 코드와는 달리 close() 할 필요 없이 지정된 코드를 수행하면 파일이 자동으로 닫히게 된다.

print("### with는 자원을 자동으로 반납해준다 ###")
with open("files/foo.txt", "w", encoding="utf-8") as f:
    f.write("Life is short, you need python")
with open("files/foo.txt", "r", encoding="utf-8") as f:
    print(f.read())

# 파일에 새로운 내용 추가하기
print()
print("### 파일에 새로운 내용을 추가할 때는 'a' 모드 사용 ###")
with open("files/foo.txt", "a", encoding="utf-8") as f:
    f.write("\nPython is very fun")
with open("files/foo.txt", "r", encoding="utf-8") as f:
    print(f.read())


Q1. 매출액 텍스트 파일을 만들어 총매출액, 평균 일 매출액을 구하라.

 

[sales.txt 파일 생성]

sales.txt 파일에 10일 간의 매출액이 입력되도록 하라.

import random

with open("sales.txt", "w") as file:
    for i in range(10):
        price = random.randrange(500000, 2000000, 500000)
        sales_price = f"{price}\n"
        file.write(sales_price)

판매 금액은 50만원부터 200만원까지 50만원 단위로 랜덤하게 10개 생성되어 sales.txt 파일에 쓰인다.

with 문을 사용하여 10회 반복이 끝나면 자동으로 종료된다.

 

sales.txt 파일을 열어보면

 

[sales.txt 파일을 열어 총매출액, 평균 일 매출액을 구하여 새로운 파일에 저장]

입력 및 출력 파일명은 각각 input을 통해 직접 입력받도록 하라

infile = input("입력 파일 이름: ")
outfile = input("출력 파일 이름: ")

inf = open(infile, "r")
outf = open(outfile, "w", encoding="utf-8")

sum = 0
count = 0

# 입력 파일에서 한 줄씩 읽어서 합계를 계산함.
line = inf.readline() # 한 줄씩 읽음
while line != "": # line이 null 이 될 때까지 (다 읽을 때까지)
    sale = int(line)
    sum += sale
    count += 1 # 평균 계산 위함
    line = inf.readline() # 한 줄을 읽고나면 다시 한 줄 읽음
avg = sum/count
# 총 매출액과 일 평균 매출액을 출력파일에 기록
outf.write(f"총매출 = {sum:,.0f}원"+ "\n")
outf.write(f"평균 일매출 = {avg:,.0f}원")
           
inf.close()
outf.close()
  • 입력 파일은 inf 라는 변수에 저장하고, 읽기 모드로 읽는다.
  • 출력 파일은 outf 라는 변수에 저장하고, 쓰기 모드로 읽는다. (한글 파일이 깨지지 않도록 인코딩 지정)
  • line 변수는 입력 파일을 한 줄씩 읽는 readline() 내장함수에 저장
  • while 문은 모든 줄을 다 읽을 때까지 각 줄의 금액을 sale 이라는 변수에 저장하고, 줄이 반복될 때마다 누적되어 더해지도록 하고, 평균을 구하기 위해 count 변수에 반복 횟수를 저장한다. 또한, 해당 순서를 다 진행하면 다시 줄을 읽도록 마지막 줄에 코드를 추가한다.
  • 반복문이 다 돌고나면 전체 금액을 반복 횟수로 나누어 avg 변수에 저장한다.
  • 그리고 파일의 wirte() 메서드를 이용하여 출력 파일에 총매출과 평균 일매출을 각각 입력해 준다.

출력 파일(summary.txt)을 열어 보면


Q. 가장 추운 날의 온도 구하기

 

1980년 4월부터 2019년 5월까지의 온도 데이터가 담긴 csv 파일을 이용해서 가장 낮은 온도를 구하라

import csv

file = open("weather.csv")
data = csv.reader(file)
header = next(data)

# 방법1
min_c = 99.9
for row in data:
   cel = float(row[3])
   if min_c > cel:
       min_c = cel
print(f"가장 추웠던 날의 기온은 {min_c}도 입니다.")  

# 방법2
cel_list = []
for row in data:
    cel_list.append(float(row[3]))
lowest_c = min(cel_list)
print(f"가장 추웠던 날의 기온은 {lowest_c}도 입니다.")    

file.close()

필자의 경우 두 가지 방법을 사용하였다.

 

◆ 방법1

  • min_c 라는 변수에 99.9 라는 값을 대입하여 초깃값을 설정했다. (보통 온도가 99.9가 올라가지는 않으므로)
  • 그리고 반복문을 이용하여 row의 3번 인덱스에 있는 값을 float(실수)형으로 변환하여 cel 변수에 저장하고
  • 조건문을 사용하여 min_c 값이 cel 변수에 들어있는 값보다 작으면 min_c 값이 바뀌도록 하였다.
  • 그리고 반복문이 종료되면 마지막에 저장된 min_c 변수 내의 값이 출력되도록 하였다.

◆ 방법2

  • 두 번째 방법은 리스트를 활용하였는데, 먼저 cel_list 라는 변수에 빈 리스트를 만들어주고,
  • 역시 반복문을 활용해 row의 3번 인덱스를 저장하여 리스트에 저장하였다. (append 사용)
  • 그리고 반복을 종료한 후 min() 메서드를 사용해 리스트에 저장된 값 중 가장 작은 값이 lowest_c 라는 변수에 저장하도록 한 뒤, 출력되도록 하였다.

그리하여 최종적으로 나온 값은


다음 내용

 

[파이썬] 파이썬 기초 - 집합 (set) 보완

집합 이전 내용 [파이썬] 파이썬기초: 자료형 - 집합 자료형시작에 앞서해당 내용은 ' 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있

puppy-foot-it.tistory.com

 

728x90
반응형