알쏭달쏭 공부한거 쓰기

7/12-파일처리 본문

파이썬 -23여름학기(ㄱㅎㅈ)

7/12-파일처리

elec_cy 2023. 7. 12. 15:28

python_day13.pdf
1.83MB

 

명시적으로 닫는 close() 보다 with 구문으로 열고 닫기

 

바이너리는 안 다룬다. 시간부족으로 

r+ 읽기모드로 열었다가 변경할 수 있다.

 

readline()-1라인만 읽는다. 라인의 끝까지 읽는데 끝의 개행문자까지 읽는다.

파일이 끝나면 빈 문자열 반환>이걸로 전체 읽어보기 

 

줄넘김 기호 제거를 위해 rstrip()사용

 

readlines() -read()

list로 반환--str로 반환

 

 

*오늘 할거

readline()으로 전체 읽기

read(argument)이용

 

2번 추구함.

 

#readline()으로 전문읽기

def readline_test():#파일 복사 프로그램 작성: 복사본 파일명=>copy.py
    with open('bmi.py','rt',encoding='utf8')as f:
        with open('copy.py','w',encoding='utf8') as ff:    
            while True:
                line=f.readline()#한라인만 읽음-> 다읽을려면 무한 반복
                if line=='':#파일 끝
                    print('end')
                    break
                ff.write(line )  #-> 콘솔이 아닐 새 파일에 작성하면 된다.
                #rstrip 없애야 개행 제대로 나온다.  왜냐하면 print가 없으니까!
                #print(line.rstrip(),file=ff)
                    
                #ff.write(line.rstrip())
                #from tkinter import *def clicked():    weight = float(input_weight.get())    height = float(input_height.get())/100#bmi 계산시 키는 m단위로 변환    bmi = weight/height**2    rslt.config(text = f'당신의 체질량 지수(BMI): {bmi:.2f}')window = Tk()Label(window, text = '체중(kg): ').grid(row = 0, column = 0)# 이 레이블은 콜백함수에서 변경할 일이 없으므로 이름을 붙여 주지 않고 바로 배치해도 무방합니다.input_weight = Entry(window, width = 30)input_weight.grid(row = 0, column = 1)Label(window, text = '키(cm): ').grid(row = 1, column = 0)input_height = Entry(window, width = 30)input_height.grid(row = 1, column = 1)btn = Button(window, text = 'BMI 계산', command = clicked)btn.grid(row = 2, column = 0, columnspan = 2, sticky = W+E+N+S)rslt = Label(window, text = '당신의 체질량 지수(BMI): ')rslt.grid(row = 3, column = 0, columnspan = 2)window.mainloop()    
                
                #개행없이 연결해서 출력된다.
readline_test()

readline().rstrip()으로 전문을 읽어올때

라인에는 공백과 개행이 있는데  빈라인인 경우 rstrip()되면서 공백을 줄 수 있는데 이경우 덜 읽었는데 break되서 끝난다.

이럴경우에는 먼저 ''검사를 먼저 하고 다음에  rstrip()으로 사용한다. 

 

이런 경우는 상대 경로를 이용하는데

 

다른 절대경로를 이용하는 경우에는 어느파일에 있는지 다 작성해야한다.

또한\제어문자의 경우에는 \\를 써야 \를 의미한다.

C:\Users\PC00\Desktop>C:\\Users\\PC00\\Desktop 써야한다.

 

def readline_test():#파일 복사 프로그램 작성: 복사본 파일명=>copy.py
    with open('C:\\Users\\PC00\\Desktop\\counter.py','rt',encoding='utf8')as f:
        with open('copy.py','w',encoding='utf8') as ff:    
            while True:
                line=f.readline()#한라인만 읽음-> 다읽을려면 무한 반복
                if line=='':#파일 끝
                    print('end')
                    break
                ff.write(line )    
                
                
readline_test()

 

#읽기 test

#read(argument)이용

def read_test():
    with open('bmi.py',encoding='utf8')as f:
        print(f.read(10)) #10글자 읽어옴 >>from tkint
read_test()

argument 값만큼 읽는다. 

 

read()인자를 비워두지 말고 read(10)을 이용하여 파일 전문읽기

마찬가지로 다 읽으면 빈 문자열을 보낸다.

파일 내용 모두 콘솔에 출력해보기

def read_test():
    with open('bmi.py',encoding='utf8')as f:
        while True:
            line=f.read(10)
            if line=='':
                print('end')
                break
                
            print(line,end='') #end 안붙여주면 10개 쓰고 자동 개행 된다.
        
read_test()

 

 

CSV 파일 처리

weather.csv
0.40MB

일반 엑셀보다 크기가 작으며

일반 엑셀은 메모장에서 안열리지만 .csv에서 메모장에서 열면 열린다. 

• Comma Separated Value>,로 값들이 분리된다. 

 

공공기관에서 제공하는 데이터는 csv로 되어 있어서 처리할 수 있으면 좋다. 

 

CSV모듈을 이용하면 쉽게 이용할 수 있다. 

 CSV는 테이블 형식의 데이터를 저장하고 이동하는데 사용되 는 구조화된 텍스트 파일

 

import csv
def csv_test():
    with open('weather.csv')as f:
        data=csv.reader(f) #한 라인씩 얻어올 수 있다.
        '''
        print(next(data))
        
        #날짜,지점,평균기온(℃),최저기온(℃),최고기온(℃)
        #['날짜', '지점', '평균기온(℃)', '최저기온(℃)', '최고기온(℃)']
        #['1980-04-01', '108', '6.5', '3.2', '11.7']
        #['1980-04-02', '108', '6.5', '1.4', '12.9']
        #각 성분을 문자열로 인식해서 리스트에 담아서 준다.
        for x in data:
            print(x)
        '''    
        #가장 더운날 구하기
        print(next(data))
        a=next(data)
        hottem=float(a[4])
        hotday=a[0]
        for x in data:
            if hottem<float(x[4]):
                hottem=float(x[4])
                hotday=x[0]
        print(f'가장 더웠던 날:{hotday} 기온: {hottem}')
csv_test()

#각 성분을 문자열로 인식해서 리스트에 담아서 준다.

 

#map,filter> 둘다 이터레이터 이다./gnerater로 보기

 

def filter_generator():
    ages=[34,39,20,18,13,54]
    ft=filter(lambda x:x>=19,ages)
    print(ft)#>리스트로 캐스팅 했음
    print(next(ft))#차례로 출력해준다.
    for x in ft:
        print(x)
filter_generator()

https://colab.research.google.com/drive/1uococtEI2292KMzDQjtTwl6EaXsy5X6v?usp=sharing 

 

Day_13.ipynb

Colaboratory notebook

colab.research.google.com

 

 

>>> import os
>>> os.listdir()
['bmi.py', 'calculator.py', 'copy.py', 'counter.py', 'fah_to_cel.py', 'hello.txt', 'practice.py', 'read test.py', 'weather.csv', 'we_will_rock.txt']
#현재 폴더의 모든 파일을 보여준다.

>>> for x in os.listdir(): #파일을 하나씩 x로 보내준다. 
...     if x[-2:]=='py':
...             print(x)
...
bmi.py
calculator.py
copy.py
counter.py
fah_to_cel.py
practice.py
read test.py

실습 5,6번

## 5. 현재 작업 디렉토리에서 파이썬 소스 파일만 찾으시오. 그 중 파일 내용 중 'python'이 포함된 파일명과 라인을 출력하는 프로그램을 작성하세요.
---

실행 결과
```
alpha_tst.py: python
week09.py: if 'python' in line.strip():
```
import os
def a():
    for x in os.listdir():
        if x[-2:]=='py':
        #if x.endswith('py')==True
            
            with open(x,encoding='utf8') as f:
                for line in f:
                    if 'python' in line:
                        print(f'{x}:{line.rstrip()}')
        
a()

6번-예외처리

## 6. 파일명을 입력 받아 해당 파일에서 한 라인을 읽어와 출력하려 한다. 아래와 같이 존재하지 않는 파일명을 입력할 경우 예외가 발행하여 비정상 종료된다. 아래 예외를 처리하세요.
---

예외 처리 전 실행 예시: 존재하지 않는 파일명 입력 시 예외 발생
```
파일명:  abc.txt
Traceback (most recent call last):
  File "C:\Users\heyjk\OneDrive\바탕 화면\ELEC520\강의자료\파일\week09.py", line 128, in <module>
    excption_tst3()
  File "C:\Users\heyjk\OneDrive\바탕 화면\ELEC520\강의자료\파일\week09.py", line 116, in excption_tst3
    with open(a, 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'abc.txt'
```
예외 처리 후 실행 예시
```
파일명:  abc.txt
abc.txt 파일을 찾을 수 없습니다. 파일 이름을 확인해주세요.
파일명:  alpha_tst.py
aaaaaaaaaa
```
import os
def a():
    #무한 반복 
    while True:
        f_name=input('file name:')
        with open(f_name,'rt') as f:
            print(f.readline().rstrip()) #없으면 비정상 에러가 된다.
            
a()

예외처리 try except 이용

def a():
    #무한 반복 
    while True:
        try:
            f_name=input('file name:')
            with open(f_name,'rt') as f:
                print(f.readline().rstrip()) #없으면 비정상 에러가 된다.
        except FileNotFoundError:
            print(f'{f_name}파일을 찾을 수 없습니다. 다시 확인해주세요')
        else:
            break
    
a()

python_day14.pdf
1.24MB

https://colab.research.google.com/drive/10whQY5LVOcMW1FIE6I2FqJyvTBzUTKNp

 

day_14.ipynb

Colaboratory notebook

colab.research.google.com

#제외

numpy 제외>배열과 비슷한 리스트

c의 배열보다 느리다, why,  리스트에 여러 자료형을 넣다보니 오래 걸림 직접 값에 접근하려면 주소를 통해 접근해야하기 때문에 오래 걸린다. 따라서 numpy에서 제공하는 배열을 이용하면 빠르게 사용할 수 있다.

넘파이의 배열은 한가지의 자료형만 담을 수 있다.

 

matplot만 범위에 들어감

 

## 1. 서울과 부산의 날씨를 그래프로 나타내세요.
```
x = [ 'Mon', 'Tue', 'Wed', 'Thur', 'Fri',  'Sat', 'Sun' ]
y1 = [15.6, 14.2, 16.3, 18.2, 17.1, 20.2, 22.4] #서울 날씨
y2 = [20.1, 23.1, 23.8, 25.9, 23.4, 25.1, 26.3] #부산 날씨
```
import matplotlib.pyplot as plt
def a():
    x = [ 'Mon', 'Tue', 'Wed', 'Thur', 'Fri',  'Sat', 'Sun' ]
    y1 = [15.6, 14.2, 16.3, 18.2, 17.1, 20.2, 22.4] #서울 날씨
    y2 = [20.1, 23.1, 23.8, 25.9, 23.4, 25.1, 26.3] #부산 날씨
    plt.plot(x,y1)#(y1)하면 인덱스가 된다.
    plt.show()
a()

연결된 선으로 표현된다.

import matplotlib.pyplot as plt
def a():
    x = [ 'Mon', 'Tue', 'Wed', 'Thur', 'Fri',  'Sat', 'Sun' ]
    y1 = [15.6, 14.2, 16.3, 18.2, 17.1, 20.2, 22.4] #서울 날씨
    y2 = [20.1, 23.1, 23.8, 25.9, 23.4, 25.1, 26.3] #부산 날씨
    plt.plot(x,y1,'o')#(y1)하면 인덱스가 된다.
    plt.show()
a()

'o'하면 점으로 표현된다.

import matplotlib.pyplot as plt
def a():
    x = [ 'Mon', 'Tue', 'Wed', 'Thur', 'Fri',  'Sat', 'Sun' ]
    y1 = [15.6, 14.2, 16.3, 18.2, 17.1, 20.2, 22.4] #서울 날씨
    y2 = [20.1, 23.1, 23.8, 25.9, 23.4, 25.1, 26.3] #부산 날씨
    plt.plot(x,y1,'o')#(y1)하면 인덱스가 된다.
    plt.plot(x,y2,'v')
    plt.title('Temperature of two cities')
    plt.xlabel('Day')
    plt.ylabel('Temperature')
    plt.show()
a()

legend-네모 박스 없으면 안 뜬다.

import matplotlib.pyplot as plt
def a():
    x = [ 'Mon', 'Tue', 'Wed', 'Thur', 'Fri',  'Sat', 'Sun' ]
    y1 = [15.6, 14.2, 16.3, 18.2, 17.1, 20.2, 22.4] #서울 날씨
    y2 = [20.1, 23.1, 23.8, 25.9, 23.4, 25.1, 26.3] #부산 날씨
    plt.plot(x,y1,'o',label='Seoul')#(y1)하면 인덱스가 된다.
    plt.plot(x,y2,'v',label='Busan')
    plt.legend()
    plt.title('Temperature of two cities')
    plt.xlabel('Day')
    plt.ylabel('Temperature')
    plt.show()
a()

# 막대 그래프 Bar

import matplotlib.pyplot as plt
def a():
    x = [ 'Mon', 'Tue', 'Wed', 'Thur', 'Fri',  'Sat', 'Sun' ]
    y1 = [15.6, 14.2, 16.3, 18.2, 17.1, 20.2, 22.4] #서울 날씨
    y2 = [20.1, 23.1, 23.8, 25.9, 23.4, 25.1, 26.3] #부산 날씨
    plt.bar(x,y1,label='Seoul')#(y1)하면 인덱스가 된다.
   
   
    plt.title('Temperature of two cities')
    plt.xlabel('Day')
    plt.ylabel('Temperature')
    plt.show()
a()

day14- matplot 1번까지만 시험 범위

 

csv 파일

가장 더웠던 날과 추운 날 출력하기

import csv
def a():
    with open('weather.csv','r') as f:
        a=csv.reader(f)
        print(next(a))
        b=next(a)
        hottep=b[-1]
        hotday=b[0]
        
        coldtep=b[-1]
        coldday=b[0]
        for x in a:
            if float(hottep)<float(x[-1]):
                hottep=x[-1]
                hotday=x[0]
            if float(coldtep)>float(x[-1]):
                coldtep=x[-1]
                hotday=x[0]
        print(f'가장 더운날{hotday}, 가장 더운 온도:{hottep}')        
        print(f'가장 추운날{coldday}, 가장 더운 온도:{coldtep}')        
                
a()

대체시험: 기말고사 범위 내에서 나온다.

 

'파이썬 -23여름학기(ㄱㅎㅈ)' 카테고리의 다른 글

과제 복습-전체 복습  (0) 2023.07.12
기말  (0) 2023.07.12
이터레이터 추가 학습 in Youtube  (0) 2023.07.11
HW11-파일 처리, map,filter  (0) 2023.07.11
7/11 12장  (0) 2023.07.11