• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

파일 읽고 쓰기에 대한 질문이 있습니다.

20.02.18 06:36 작성 조회수 99

1

강의와 책을 같이 보면서 공부중입니다.

파일에 임의의 내용을 3줄로 써놓은 상태에서 한 줄씩 읽은 결과물에 대해서 의문이 생깁니다.

# 파일의 내용을 한줄씩 읽기
with open('Hello.txt'mode='r'as file:
    line = None
    while line != '':
        line = file.readline()
        print(line.strip('\n'))   

# for 반복문을 이용하여 파일의 내용을 한줄씩 읽기
with open('Hello.txt'mode='r'as file:
    for line in file:
        print(line.strip('\n'))

위 내용을 실행해보면 위의 경우에는 3줄이 모두 출력된 다음에 공백이 한 줄 생기는데

아래의 경우에는 공백 없이 3줄을 출력후에 종료가 됩니다. 무슨 차이인지 잘 모르겠습니다.

위의 경우에 line 변수에 마지막줄이 출력된 다음에 그 다음줄로 넘어간다고 해도

while 조건에서 거짓이 되니까 line이 공백이더라도 출력이 안돼야 하는게 정상인거 같은데...아닌가요?

답변 1

답변을 작성해보세요.

0

위 이미지에서 처럼 라인을 찍어보면 좀 더 편하게 알 수 있습니다. (마우스 우클릭 > 새창에서 이미지 보기) 

for 문은 조건 자체가 file 에 있는 line 만큼만 돌게 되어있기 때문에 그렇게 출력되고 while 문에서는 line != "" 이라는 조건이 결국 print() 후에 조건을 판단하게 되기 때문에 어쨌든 공백이 먼저 출력되기 때문에 그렇게 찍히는게 맞습니다. 

while line != "": 이 문장은 while 문을 실행하기 위한 조건이지 print() 가 출력되는 조건은 아닙니다. print 문은 어쨌든 while 문 안에 있기 때문에 while 문 안으로 진입한 이상 무조건 실행되게 됩니다. 그리고 line != "" 에서 line 값은 while 문 안에서 수정되기 때문입니다. (말이 더 어렵습니다.)

with open('Hello.txt', mode='r') as file:
    line = None
    while True:
        line = file.readline().strip()
        if line == "":
            break
        print(line)

그래서 while문으로 for문과 같이 실행되려면 위의 코드처럼 짜야 합니다. 물론 이런스타일로도 많이 코딩하긴 하지만 while 문을 탈출하는 조건이 개발자가 실수해서 무한루프로 빠질수 있기에 신경써야 하는 스타일입니다.

a.strip() 하면 a의 변수 값을 strip() 하기만 하지 이 값이 다시 a 에 적용되지 않습니다. 그래서 a = a.strip() 을 해야 a에 적용됩니다. 위의 코드에서 이와 비슷한 실수로 무한루프에 빠질 수 있는 부분을 말씀드리고 싶었습니다.

궁금증이 해결되셨으면 좋겠습니다.