본문 바로가기

Python

220112 학습일기

 

1.

파일을 쓰기모드로 열어봤으니 이젠 뭐라도 써보자.

f = open("1월9일.txt", "w")
for i in range(1, 10):
    f.write("This is line {} \n".format(i))
f.close()

 

이렇게 하면

"1월9일.txt"라는 파일이 이렇게 된다.

 

위의 방법과 아래에 나오는 방법의 차이점을 알아보자.

for i in range(1,10):
    print("This is line {}".format(i))

두 프로그램의 다른 점은 출력하는 방법이다.
첫번째 방법은 모니터 화면 대신 파일에 결괏값을 적는 방법이고(파일 객체 f의 write함수 사용),
두번째 방법은 모니터 화면에 출력하는 방법이다(print 사용).

 

2.

Hi.txt 파일을 만들어보자.(현재 작업하고 있는 파이썬 디렉토리에)

readline()은 파일의 한줄 한줄 반환해주는 함수이다.

 

f = open("Hi.txt", "r",encoding="utf-8")
line = f.readline()
print(line)
f.close()

출력값은 다음과 같다.

안녕안녕

위 코드블럭에서는 표시가 안되지만 안녕안녕 밑에 빈 줄도 하나 더 출력되었다.

'안녕안녕' 하고 줄바꿈하고 '메롱메롱' 하고 줄바꿈하고 '하이하이' 해서 그런것 같다.

 

이걸 더 확실하게 확인하려면 readlines() 를 해주면 된다.

f = open("Hi.txt", "r",encoding="utf-8")
line = f.readlines()
print(line)
f.close()

 

['안녕안녕\n', '메롱메롱\n', '하이하이']

readlines()로 파일을 읽으면 한 줄, 한 줄이 각각 리스트의 원소로 들어간다.

 

한 줄 씩 읽어 출력할 때 줄 끝에 \n 문자가 있으면 빈 줄도 같이 출력된다.

 

 

모든 줄을 읽어주고 싶으면

f = open("Hi.txt", 'r',encoding="utf-8")
while True:
    line = f.readline()
    if not line: break
    print(line)
f.close()

이렇게 해주면 된다.

그럼 출력값은

안녕안녕

메롱메롱

하이하이

 

그리고 여기서 encoding = "utf-8" 을 굳이 해준 이유는 

"Hi.txt"에 한글이 있기 때문이다.(안녕안녕, 메롱메롱, 하이하이)

인코딩 코드를 삽입해주지 않으면 한글이 다 깨져서 나온다.

 

근데 여기서 궁금증이 있다.

꼭 f.readline()을 변수에 저장해줘야하는걸까?

그래서 변수에 저장을 안 해봤다.

f = open("Hi.txt", 'r',encoding="utf-8")
while True:
    if not f.readline(): break
    print(f.readline())
f.close()

이렇게 하면 출력값이 조금 괴랄하게 나온다.

메롱메롱
#빈 줄
#빈 줄

???

왜 이런걸까?

 

점프 투 파이썬 저자분께 여쭤봤다.

답변은 아래와 같다.

https://pybo.kr/pybo/question/detail/1087/

 

변수에 저장을 하고 안 하고의 문제가 아니였다.
f.readline()을 호출하는 횟수와 상관이 있었다.
문제의 그 코드는 readline()이 루프 내에서 두번 호출이 되었다.
그게 문제였던 것이다!!

f = open("Hi.txt", 'r',encoding="utf-8")
while True:
    if not f.readline(): break
    print(f.readline())
f.close()

이 코드가 아래와 같이 출력된 까닭을 설명하겠다.

메롱메롱
#빈 줄
#빈 줄

아 참고로 안녕- 메롱-하이 순이다.

 

코드의 실행 순서는 다음과 같다.

if not f.readline() 에서 먼저

'안녕안녕

#빈줄     '

을 반환했다. but 출력은 실행x

그리고 if 문을 만족하지 않았기 때문에 break도 실행 x

 

그리고 print(f.readline()) 에서

'메롱메롱

#빈줄    '

을 반환했다. 그리고 출력을 실행.

그래서 출력문에 

'메롱메롱

#빈줄    ' 이 있는 것이다.(1,2번째 줄)

 

그리고 다시 위로 올라간다. 왜냐? While True로 무한루프가 걸렸기 때문.

if not f.readline() 에서 먼저 

'하이하이' 를 반환했다.

여기서 빈줄이 없는 이유는 위에 readlines()로 읽었을 때 마지막줄은 \n이 없었기 때문이다.

그리고 print(f.readline())에서

빈 줄을 반환했다. 그리고 출력을 진행.

 

다시 위로 올라가서(While True)

if not f.readline() 을 실행하면 f.readline()는 빈 줄을 반환한다.

그런데 빈 줄은 ''(비어있는 string)이므로 false다. 따라서 not f.readline() 조건에 만족하고 따라서 break가 실행된다.

멈춘다.

이후 while True문을 탈출하고 객체 f는 종료된다.

 

 

여기서 또 알아야 할 사실은 더이상 출력할 것이 없을 때 f.readline()을 호출하면 빈 줄을 반환한다.

나도 처음엔 오류가 뜰 것이라고 생각했는데 그렇지 않다.

 

num.txt라는 파일을 새로 써보자.

num.txt는 아래와 같다.

1111
2222
3333

 

f = open("num.txt", 'r',encoding="utf-8")

print(f.readline())
print(f.readline())
print(f.readline())
f.close()

자 이제 실행해보자

1111

2222

3333

전체 파일을 읽었을 때 사실 이게 끝이다.

 

근데 여기서 멈추지 않고 print(f.readline())을 계속한다면?

f = open("num.txt", 'r',encoding="utf-8")

print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()

 

1111

2222

3333
#빈 줄
#빈 줄

 

위 코드보다 print(f.readline())을 두 개 더 넣었다.

그랬더니 빈 줄이 두개 더 생겼다.

 

 

-readlines()

https://wikidocs.net/82

 

6.2 한 줄 씩 다루기

지난 시간에 이어 오늘도 텍스트 파일을 괴롭혀 보겠습니다. 오늘은 한 줄 씩 난도질을… --+ 파이썬이 설치된 디렉터리에 있는 `LICENSE.txt` 파일을 열어보겠습니 ...

wikidocs.net

 

점프 투 파이썬

https://wikidocs.net/book/1

 

점프 투 파이썬

** 점프 투 파이썬 오프라인 책(개정판) 출간 !! (2019.06) ** * [책 구입 안내](https://wikidocs.net/4321) 이 책은 파이썬 ...

wikidocs.net

 

 

 

 

'Python' 카테고리의 다른 글

220116 학습일기  (0) 2022.01.16
220115 학습일기  (0) 2022.01.15
220109 학습일기  (0) 2022.01.10
220106 학습일기  (0) 2022.01.06
220103 학습일기  (0) 2022.01.03