본문 바로가기
  • Top Genius in the world
알고리듬

[알고리듬 ] #40 파일 처리

by Mr.Algo 2024. 4. 7.
728x90
반응형

파이썬 실습창을 열 수 있습니다.실습창 열기

 

건물의 기초공사

한 분야의 경지에 오른 분들은 기초를 얘기합니다.

멋지고 안전한 건축물은 튼튼한 기초위에  세워집니다. 

오늘의 공부를 마치면 알고리듬의 1단계 기초공사가 마무리 됩니다.

세상에서 가장 멋진 건물을 지어 봅시다.

 

1. 파일 처리

우리는 지난 시간에 input.txt 파일을 만들었습니다.

 

 

오늘은 그 파일을 처리하여 다음과 같은 output.txt 파일을 만들려고 합니다.

시작합시다.

 

 

1-1. 파일 읽기

다음 코드를 작성하여 실행합시다.

fin=open('d:/input.txt')        # 실습창이면 경로 없이 'input.txt'
fout=open('d:/output.txt','w')  # 실습창이면 경로 없이 'output.txt'
data=fin.readline()             # 파일의 첫째 줄 읽음(data는 임의의 이름)
while data:                     # data가 참인 동안 아래의 들여쓰기한 부분 반복 실행
    print(data)                 # data가 있으면 참, 다 읽었으면 data가 null('')이므로 거짓
    data=fin.readline()         # 파일의 다음 줄을 읽고 while문으로 감(4번 줄)
fin.close()
fout.close()

'''
실습창이면 input.txt를 업로드하고 위의 코드를 실행하여야 합니다. (#39 참조)
출력은 다음과 같습니다.
1 2 3
4 5
6 7 8 9
파일을 잘 읽었는지 확인하였습니다.
'''

 

1-2  data 분할

읽은 data를 분할합니다.

위의 코드를 수정합니다.

fin=open('d:/input.txt')
fout=open('d:/output.txt','w')
data=fin.readline()
while data:
    s=data.split()       # 여기 수정: data를 공백 기준으로 분할
    print(s)             # 결과 확인
    data=fin.readline()
fin.close()
fout.close()

'''
['1', '2', '3']
['4', '5']
['6', '7', '8', '9']

위와 같이 분할되어 list의 item이 됩니다.
'''

 

1-3 식 만들기

숫자 사이에 '+' 기호를 넣어서 시을 만듭시다.

fin=open('d:/input.txt')
fout=open('d:/output.txt','w')
data=fin.readline()
while data:
    s=data.split()
    sik='+'.join(s)      # 여기 수정: 숫자 사이에 '+' 삽입
    print(sik)           # 결과 확인
    data=fin.readline()
fin.close()
fout.close()

'''
1+2+3
4+5
6+7+8+9

위와 같이 출력 됩니다.
join 등은 스트링 메소드(str method) 부분을 복습하세요.
join메소드를 사용하지 않고 replace를 사용할 수도 있습니다.
sik=data.replace(' ','+')   # 공백을 '+'로 바꿈 

그러나 join을 사용한 것은 다음에 합을 구할 때 data를 list로 바꾸어야 합니다.
이왕 5번 줄에서 list로 바꾸어(s) 놓았으므로 join을 사용하였습니다.
'''

 

1-4 합계 구하기

각 줄의 합계를 구하여 봅시다.

fin=open('d:/input.txt')
fout=open('d:/output.txt','w')
data=fin.readline()
while data:
    s=data.split()
    sik='+'.join(s)
    hap=sum(map(int,s))   # 여기를 수정(아래의 설명 참조)
    print(hap)            # 결과 확인
    data=fin.readline()
fin.close()
fout.close()

'''
결과는
6
9
30

map(int, s)는 아직 공부하지 않은 함수입니다.
map(맵)은 s의 각 아이템에 대하여 int를 취합니다.
즉, s의 모든 원소를(현재는 스트링) 정수로 변환합니다.

map 함수의 사용 방법은 다음과 같습니다.
map(func, *iterables): 반복 가능한 object를 순차적으로 함수(func)에 적용한다.

sum은 s의 전체 합을 구하는 함수입니다.(순서열 공통연산 복습)
'''

 

1-5 출력하기

먼저 화면에 출력하여 보고 바르게 출력되면 파일에 출력합시다.

fin=open('d:/input.txt')
fout=open('d:/output.txt','w')
data=fin.readline()
while data:
    s=data.split()
    sik='+'.join(s)
    hap=sum(map(int,s))
    print(sik,'=',hap)    # 여기를 수정     
    data=fin.readline()
fin.close()
fout.close()

'''
1+2+3 = 6
4+5 = 9
6+7+8+9 = 30

이렇게 출력됩니다.

 

● 바르게 출력되므로 파일에 출력합니다.

fin=open('d:/input.txt')
fout=open('d:/output.txt','w')
data=fin.readline()
while data:
    s=data.split()
    sik='+'.join(s)
    hap=sum(map(int,s))
    w=sik+'='+str(hap)     # 여기를 수정 
    flot.write(w)          # 여기도 수정
    data=fin.readline()
fin.close()
fout.close()

'''
output.txt 파일을 확인하면 다음과 같습니다.
1+2+3=6
4+5=9
6+7+8+9=30

w는 하나의 스트링을 만드는 것입니다.
sik에 '='을 이어 붙이고 또 숫자인 hap을 문자로 변환하여 붙입니다.
'''

 

2. 입출력 시간 단축하기

파일을 읽고 쓰는 시간은 다른 처리에 비하여 매우 매우 느립니다.

하드 디스크를 돌려서 데이터 위치를 찾는 시간이 매우 느리기 때문입니다. 

파일을 한 줄씩 처리하면 한 줄마다 위치 찾는 일을 반복해야 합니다.

그래서 한 번에 전체 데이터를 주기억 장치에 읽어 놓고 처리하면 시간이 크게 단축됩니다.

(물론 데이터가 매우 많아서 주기억 장치에 모두 저장할 수 없으면 나누어 읽어야 합니다.)

 

이러한 방법으로 코딩하여 봅시다.

# 들여쓰기를 주의하세요.
fin=open('d:/input.txt')
fout=open('d:/output.txt','w')
r=[]                         # 출력 자료를 r에 모을 예정입니다.
data=fin.readlines()         # 파일의 모든 자료를 읽습니다. (마지막에 s있음)
for i in data:               # data는 list, item을 순서대로 i에 바인딩
    s=i.split()              
    sik='+'.join(s)
    hap=sum(map(int,s))      # 간단한 방법은 hap=eval(sik)
    w=sik+'='+str(hap)+'\n'  # 마지막에 줄바꿈('\n') 추가
    r.append(w)              # 출력 자료를 r에 모은다.
for w in r:                  # r의 내용을 순차적으로 출력(파일 출력은 하나의 문자열)
    fout.write(w)   
fin.close()
fout.close()

'''
eval() 함수는 문자열 형태의 수식을 계산합니다.
실습창에서는 이 함수를 지원하지 않습니다.
'''

 

쉽지 않은 1단계 기초 공부를 마쳤습니다.

수 많은 사람들이 1단계를 넘기지 못하고 낙오자가 됩니다.

낙오자는 아마도 이번 생에서는 알고리듬을 포기(?)해야 할 지도 모릅니다.

 

통과하신 여러분을 축하합니다.

세계 정상급으로 오를 가능성이 충분히 있습니다.

기대합니다.

 

오늘 끝.

 

 

728x90
반응형