본문 바로가기

Study/class note

python / readline,write,writelines,read/write,rb/rw,with~as

135 텍스트 파일을 한줄씩 읽고 출력하기 ① (readline)

텍스트 파일의 용량이 매우 클 경우 read()로 한꺼번에 파일의 내용을 읽어들이는 것은 메모리 문제를 야기할 수 있음. 이 경우 텍스트 파일 내용을 한 줄 단위로 읽고 작업을 수행하면 됨. readline()은 텍스트 파일에서 한 줄을 읽음. 한 줄을 읽고 나면 파일을 읽기 시작하는 위치는 그 다음 줄의 맨 처음이 됨.

# 문법
f = open("c:\\data\\jobs.txt", encoding = 'utf8')
data = f.readline()
print(data)   # 맨 위의 한 줄을 읽음 steve jobs'2005 stanford commencement address

문제402. 위에서는 스티브잡스 연설문 한 줄만 읽어왔는데 loop문을 이용해서 마지막 줄까지 다 읽어올 수 있게 하시오.

# while문 - readline() 사용
f = open("c:\\data\\jobs.txt", encoding = 'utf8')
data = f.readline()

while data:     # data라는 변수안에 텍스트가 있으면 True, 없으면 False
    print(data)
    data = f.readline()# 그 다음줄을 읽어서 data변수에 입력
f.close()

# for문 사용1
f = open("c:\\data\\jobs.txt", encoding = 'utf8')
for i in f:
    print(i)
    
# for문 사용2
f=open("c:\\data\\jobs.txt",encoding='utf8')

for i in f:
    i = i.rstrip()
    print(i)
f.close()

문제403. 위의 코드를 이용해서 스티브 잡스 연설문에는 mother라는 단어가 몇 번 나오는지 카운트하시오.

f = open("c:\\data\\jobs.txt", encoding = 'utf8')
data = f.readline()

cnt = 0
while data:     
    cnt += data.count('mother')
    data = f.readline()
f.close()

print(cnt)

+) while문 - readline()은 결국에 텍스트파일 전문을 가져오는 과정임. 하지만 텍스트파일에서 범위를 지정해서 몇 줄만 가져오겠다 하면 for문에 범위를 지정해서 가져오면 됨.

f = open("c:\\data\\jobs.txt", encoding = 'utf8')

for i in range(5):
    print(f.readline())

문제404. 스티브 잡스 연설문에서 mother단어는 몇 번 나오고 father는 몇 번 나오는지 출력하시오.

f = open("c:\\data\\jobs.txt", encoding = 'utf8')
data = f.readline()

cnt1 = 0
cnt2 = 0
while data:     
    cnt1 += data.lower().count('mother')
    cnt2 += data.lower().count('father')
    data = f.readline()
f.close()

print('mother 단어수 : ',cnt1)   # mother 단어수 :  3
print('father 단어수 : ',cnt2)   # father 단어수 :  1

문제405. 보험회사 상담원들이 상담한 내용중에 금융 상담에 부적절한 용어가 포함되어져 있는지 확인함.(보통 금융감독원 보고용으로 보험회사는 매번 상담내용을 분석함.) 이와 같은 분석을 경험하기 위해 mydata3.txt를 이용해 아래와 같이 출력하시오.(파이썬 실무 활용 사례1)

f=open("c:\\data\\mydata3.txt",encoding='utf8')
data = f.readline()

cnt1 = 0
cnt2 = 0
while data:
    cnt1 += data.count('빅데이터')
    cnt2 += data.count('인공지능')
    data = f.readline()
f.close()

print('빅데이터 단어수 :',cnt1)   #빅데이터 단어수 : 11
print('인공지능 단어수 :',cnt2)   #인공지능 단어수 : 24

문제406. 그 상담내용도 같이 출력되게 하시오.

f=open("c:\\data\\mydata3.txt",encoding='utf8')
data = f.readline()

cnt1 = 0
cnt2 = 0
while data:
    if data.count('빅데이터') >=1 or data.count('인공지능') >= 1:
        if data.count('빅데이터') >=1 and data.count('인공지능') >= 1:
            print('[빅데이터',data.count('빅데이터'),'개]','[인공지능',data.count('인공지능'),'개]',data)
        elif data.count('빅데이터') >=1:
            print('[빅데이터',data.count('빅데이터'),'개]', data)
        elif data.count('인공지능') >= 1:
            print('[인공지능',data.count('인공지능'),'개]', data)
        cnt1 += data.count('빅데이터')
        cnt2 += data.count('인공지능')
    data = f.readline()
f.close()

print('빅데이터 단어수 :',cnt1)   #빅데이터 단어수 : 11
print('인공지능 단어수 :',cnt2)   #인공지능 단어수 : 24

+) readlines()는 한줄씩 모든 줄을 가져옴. 결과적으로 read()와 같음.

 

 

136 화면에서 사용자 입력을 받고 파일로 쓰기(write)

사용자로부터 입력받은 텍스트를 파일로 저장하려면 파일을 텍스트 쓰기 모드로 오픈하고 파일 객체의 write()를 이용해 데이터를 파일에 기록함.

 

문법 : 월급이 1500 이상인 사원들의 이름과 월급을 result1500.csv로 저장하시오.

 

1. 판다스의 데이터 프레임 결과를 csv 파일로 내리는 코드

import pandas as pd

emp = pd.read_csv("c:\\data\\emp2.csv")
emp[['ename','sal']][emp.sal >= 1500].to_csv("c:\\data\\result1500.csv")

2. 변수의 내용을 text파일로 내리는 코드

text = 'i never graduated colleage'
f = open("c:\\data\\mydata100.txt","w")    # 파일을 생성시킨 후, w는 쓰기모드 하겠다는 의미
f.write(text)     # 파일에 변수 text를 입력함
f.close()       # 파일 닫음, 꼭 닫아줘야지 쓰기가 완료됨

문제407. 데이터 게시판에서 iris2.csv를 내려받아서 Sepal.Width가 3 이상인 모든 컬럼의 데이터를 result391.csv로 저장하시오.

import pandas as pd

iris = pd.read_csv("c:\\data\\iris2.csv")

iris[:][iris['Sepal.Width']>=3].to_csv("c:\\data\\result391.csv")
# 모든 컬럼을 다 가지고 올때는 [:]를 사용하면 됨

문제408. 위에서 했던 mydata3에서 뽑아낸 '인공지능','빅데이터' 건수 출력 결과를 result20211230.txt로 저장되게 하세요.

# 내가 쓴 코드  = 변수에 다 넣어서 마지막에 파일쓰기
f=open("c:\\data\\mydata3.txt",encoding='utf8')
data = f.readline()

cnt1 = 0
cnt2 = 0
a = ''
while data:
    if data.count('빅데이터') >=1 or data.count('인공지능') >= 1:
        if data.count('빅데이터') >=1 and data.count('인공지능') >= 1:
            a += '[빅데이터'+str(data.count('빅데이터'))+'개]'+'[인공지능'+str(data.count('인공지능'))+'개]'+data
        elif data.count('빅데이터') >=1:
            a += '[빅데이터'+str(data.count('빅데이터'))+'개]'+data
        elif data.count('인공지능') >= 1:
            a += '[인공지능'+str(data.count('인공지능'))+'개]'+data
        cnt1 += data.count('빅데이터')
        cnt2 += data.count('인공지능')
    data = f.readline()
f.close()

a += '빅데이터 단어수 :'+str(cnt1)+'\n인공지능 단어수 :'+str(cnt2)

f2 = open("c:\\data\\result20211230.txt","w")
f2.write(a)
f2.close()

# 선생님이 쓴 코드 = 데이터가 나올때마다 쓰기
f=open("c:\\data\\mydata3.txt",encoding='utf8')
f2 = open("c:\\data\\result1230_ver2.txt","w")
data = f.readline()

cnt1 = 0
cnt2 = 0

while data:
    if data.count('빅데이터') >=1 or data.count('인공지능') >= 1:
        if data.count('빅데이터') >=1 and data.count('인공지능') >= 1:
            f2.write('[빅데이터'+str(data.count('빅데이터'))+'개]'+'[인공지능'+str(data.count('인공지능'))+'개]'+data)
        elif data.count('빅데이터') >=1:
            f2.write('[빅데이터'+str(data.count('빅데이터'))+'개]'+data)
        elif data.count('인공지능') >= 1:
            f2.write('[인공지능'+str(data.count('인공지능'))+'개]'+data)
        cnt1 += data.count('빅데이터')
        cnt2 += data.count('인공지능')
    data = f.readline()
f.close()

f2.write('빅데이터 단어수 :'+str(cnt1)+'\n인공지능 단어수 :'+str(cnt2))
f2.close()

 

문제409. (점심시간 문제) 위의 코드를 함수로 만들어서 아래와 같이 함수를 수행하면 금융감독원에 보고할 텍스트 파일이 만들어지게 하시오.

def incorrect_word(a):
    f=open("c:\\data\\mydata3.txt",encoding='utf8')
    f2 = open("c:\\data\\"+a,"w")
    data = f.readline()

    cnt1 = 0
    cnt2 = 0
    a = ''
    while data:
        if data.count('빅데이터') >=1 or data.count('인공지능') >= 1:
            if data.count('빅데이터') >=1 and data.count('인공지능') >= 1:
                f2.write('[빅데이터'+str(data.count('빅데이터'))+'개]'+'[인공지능'+str(data.count('인공지능'))+'개]'+data)
                f2.write('=='*30 + '\n')
            elif data.count('빅데이터') >=1:
                f2.write('[빅데이터'+str(data.count('빅데이터'))+'개]'+data)
                f2.write('=='*30 + '\n')
            elif data.count('인공지능') >= 1:
                f2.write('[인공지능'+str(data.count('인공지능'))+'개]'+data)
                f2.write('=='*30 + '\n')
            cnt1 += data.count('빅데이터')
            cnt2 += data.count('인공지능')
        data = f.readline()
    f.close()

    f2.write('빅데이터 단어수 :'+str(cnt1)+'\n인공지능 단어수 :'+str(cnt2))
    f2.close()
    
incorrect_word('result20211231.txt')

 

 

137 텍스트 파일에 한줄씩 쓰기(writelines)

파일 객체의 writelines()는 텍스트 문자열이나 텍스트 문자열이 요소로 되어있는 리스트를 인자로 받아 파일에 한 줄씩 기록함.

리스트가 인자인 경우 writelines()는 리스트의 요소를 하나의 문자열로 결합하여 파일에 한꺼번에 기록함.

a = ['빅데이터','인공지능']

f = open("c:\\data\\mydata137.txt","w")
f.write(str(a))
f.close()

f2 = open("c:\\data\\mydata138.txt","w")
f2.writelines(a)
f2.close()

write()는 리스트를 통째로 문자열로 출력했고(mydata137), writelines()는 리스트의 요소들을 각각 문자열로 결합하여 출력함(mydata138).

 

 

138 텍스트 파일 복사하기(read, write)

텍스트파일 복사를 파이썬으로 구현하려면 read(), write()를 사용하면 됨. read()로 파일을 읽고 write로 읽은 내용을 다른 파일 이름으로 저장하면 됨.

f = open("c:\\data\\mydata3.txt", "r", encoding = "utf8")
h = open("c:\\data\\mydata3_copy.txt","w")
data = f.read()  # 데이터 읽기
h.write(data) #쓰기
f.close()
h.close()

 

1. 텍스트파일.read() : 텍스트파일 전체를 한번에 읽어들이는 것

2. 텍스트파일.readline() : 텍스트파일을 한줄씩 읽어들이는 것

3. 텍스트파일.write() : 텍스트파일을 txt나 csv로 쓰기

4. 텍스트파일.writelines() : 텍스트파일의 한 줄을 csv파일로 생성함. 리스트 자료형도 파일에 저장 가능

5. 텍스트파일.read() , 텍스트파일.write() : 텍스트파일 복사 붙여넣기

 

 

문제410. (복습) 아래의 gini 사전형에서 데이터 값들을 추출해서 아래의 결과를 출력하시오

[['yesterday', 'imagine'], ['너랑나', '마쉬멜로우'], ['beat it', 'smooth criminal']]

gini = { '비틀즈' : ['yesterday', 'imagine'], '아이유' : ['너랑나', '마쉬멜로우'], '마이클 잭슨' : ['beat it', 'smooth criminal'] }

a = []
for i in gini.values():
    a.append(i)
print(a)

	# 또는

b = list(gini.values())
print(b)

 

문제411. (복습) 위에서 출력되는 리스트 안의 요소들을 shuffle해서 매번 수행할때마다 아래처럼 shuffle되게 하시오.

gini = { '비틀즈' : ['yesterday', 'imagine'], '아이유' : ['너랑나', '마쉬멜로우'], '마이클 잭슨' : ['beat it', 'smooth criminal'] }

from random import shuffle

a = list(gini.values())
shuffle(a)
a

문제412. 위에서 shuffle되고 있는 리스트의 요소들중에 0번째 요소만 추출하시오.

gini = { '비틀즈' : ['yesterday', 'imagine'], '아이유' : ['너랑나', '마쉬멜로우'], '마이클 잭슨' : ['beat it', 'smooth criminal'] }

from random import shuffle

a = list(gini.values())
shuffle(a)

b = []
for i in a:
    b.append(i[0])
print(b)

문제413. 1번째 요소도 같이 출력되게 하시오.

gini = { '비틀즈' : ['yesterday', 'imagine'], '아이유' : ['너랑나', '마쉬멜로우'], '마이클 잭슨' : ['beat it', 'smooth criminal'] }

from random import shuffle

a = list(gini.values())
shuffle(a)

b = []
c = []
for i in a:
    b.append(i[0])
for i in a:
    c.append(i[1])
print(b)
print(c)

문제414. (복습문제) 위의 리스트 2개가 서로 연결되어서 아래와 같이 출력되게 하시오.

gini = { '비틀즈' : ['yesterday', 'imagine'], '아이유' : ['너랑나', '마쉬멜로우'], '마이클 잭슨' : ['beat it', 'smooth criminal'] }

from random import shuffle

a = list(gini.values())
shuffle(a)

b = []
c = []
for i in a:
    b.append(i[0])
for i in a:
    c.append(i[1])

song = b+c
print(song)

문제415. (카카오 입사문제) gini 딕셔너리에서 음악을 뽑아서 아래의 결과를 출력하는데 아티스트별로 서로 겹치지 않게 출력하시오.

gini = { '비틀즈' : ['yesterday', 'imagine'], '아이유' : ['너랑나', '마쉬멜로우'], '마이클 잭슨' : ['beat it', 'smooth criminal'] }

from random import shuffle

a = list(gini.values())
shuffle(a)

# for i in range(len(a)):       아티스트의 노래도 셔플하고 싶을 때
#     shuffle(a[i])

b = []
c = []
for i in a:
    b.append(i[0])
    c.append(i[1])

song = b+c
bond = ','
print(bond.join(song))

 

 

139 바이너리 파일 복사하기(read, write)

이미지나 동영상도 파이썬으로 복사, 붙여넣기 가능

이미지나 동영상을 복사 붙여넣기 할 때는 파일의 크기가 크므로 한번에 읽어들일 수 없고 일부분만 일정한 크기로 읽으면서 복사 붙여넣기 함.

bufsize = 1024   # 1kb 크기의 버퍼 사이즈를 지정

f = open("c:\\data\\lena.png","rb")  # rb : 바이너리 파일 읽기
h = open("c:\\data\\lena_copy.png","wb")  # wb : 바이너리 파일 쓰기

data = f.read(bufsize)  # 이미지를 1kb 읽어서 data에 저장

while data:     # 데이터 변수에 data가 발견되는 동안 loop문 수행
    h.write(data)
    data = f.read(bufsize)
f.close()
h.close()

문제415. 설현 사진을 복사해서 a_copy.jpg로 저장하시오.

bufsize = 1024   # 1kb 크기의 버퍼 사이즈를 지정

f = open("c:\\users\\ejcej\\downloads\\a.jpg","rb")  # 다운로드 파일에 있는 사진을 읽어와서
h = open("c:\\data\\a_copy.jpg","wb")  # data 파일에 붙여넣기

data = f.read(bufsize)  

while data:    
    h.write(data)
    data = f.read(bufsize)
f.close()
h.close()

문제416. (복습문제) 아래의 리스트에서 숫자가 100 이상이면 출력하고 100 미만이면 출력되지 않게 하시오.

[299, 102, 500]

b = [299, 89, 102, 20, 50, 500]

print(list(filter(lambda x : x>= 100, b)))

 


140 파일을 열고 자동으로 닫기 (with ~ as )

with ~ as 절을 사용하게 되면 f.close()를 명시하지 않아도 되므로 프로그래머가 실수로 f.close()를 작성하지 않아서 발생하는 메모리 부족 오류를 예방할 수 있음.

1. with ~ as절을 사용하지 않았을 때

f = open("c:\\data\\mydata3.txt","r", encoding = "utf8")
data = f.readlines()
print(data)
f.close()   # 안쓰면 메모리 부족 오류 생김

2. with ~ as절을 사용했을 때

with open("c:\\data\\mydata3.txt","r",encoding = 'utf8') as f:
    data = f.readlines()
    print(data)

 

문제 417. (복습문제) 아래의 SQL을 판다스로 구현하시오.

-- SQL
select *
 from emp
 where comm is not null;
# 판다스
import pandas as pd

emp = pd.read_csv("c:\\data\\emp2.csv")
# emp[:][~emp['comm'].isnull()]    뭘 써도 상관없음
emp[:][~emp['comm'].isna()]

문제418. (복습문제) 우리반 테이블에서 성씨를 뽑고 성씨별 건수를 출력하시오.

import pandas as pd

emp14 = pd.read_csv("c:\\data\\emp14.csv")
emp14['ename_first'] = emp14.ename.apply(lambda x:x[0])
a = emp14.groupby('ename_first')[['ename']].count()
a.columns = ['인원수']
a
# a.sort_values('인원수', ascending = False)   인원수가 많은순으로 정렬

 

반응형