티스토리 뷰

728x90
반응형

Chapter 11 연습문제 풀이

 

1. 파일 입출력과 관련된 함수를 보기에서 모두 고르시오.

 

input(),  read(),  readline(),  print(),  write(),  writeline(),  readlines()

 

Answer

read()파일의 내용 전체를 문자열로 리턴

readline() # 파일을 한 행씩 읽어 반환한다.

write() # 파일에 인자 값으로 준 스트링을 쓴다.

readlines() 파일의 모든 라인을 읽어서 각각의 줄을 요소로 갖는 리스트로 리턴

'''

쓰기 함수 중 wirtelines() 함수도 있는데 이 함수는 문자열 리스트를 인자 값으로 받아 파일에 쓴다. 단, 주의해야 할 점은 리스트의 각 요소에 개행 문자 '\n'을 넣어 줘야 줄 단위로 개행되어 작성된다.

'''

 

 

2. 파일을 열고 한 줄 읽어서 출력하는 코드이다. 빈칸을 채우시오.

 

inFp = open("C:/Temp/data1.txt", "r", encoding = "utf-8")

 

inList = inFp.readline()

for inStr in inList :

    print(inStr, end = "")

 

inFp.close()

 

 

3. 파일의 내용을 통째로 읽어서 리스트에 저장한 후 리스트의 내용을 하나씩 추출해 출력하는 코드이다. 빈칸을 채우시오.

 

inFp = open("C:/Temp/data1.txt", "r", encoding = "utf-8")

 

inList = inFp.readlines()

for inStr in inList :

    print(inStr, end = "")

 

inFp.close()

 

 

4. open() 함수로 파일을 열려고 한다. 다음 중 파일이 없을 때 오류를 방지하는 함수는?

 

① os.path.file()

② os.path.error()

③ os.path.exists()

④ os.path.close()

Answer ③ 

'''

os라는 모듈을 import 해서 사용한다.

os 모듈은 Operating System의 약자로서 운영체제에서 제공되는 여러 기능을 파이썬에서 수행할 수 있게 해준다.

그 중에서도 os.path는 파일 경로를 생성 및 수정하고, 파일 정보를 쉽게 다룰 수 있게 해주는 모듈.

os.path.exists는 입력받은 경로가 존재하면 True를 반환하고, 존재하지 않는 경우는 False를 반환

'''

 

 

5. 도스의 copy 명령어와 비슷하게 구현한 코드이다. 빈칸을 채우시오.

 

# 입력 파일은 in에, 출력 파일은 out에 열려져 있음

 

inList = inFp.readlines()    # 입력 파일의 모든 내용을 읽어 리스트로 담는다.

for inStr in inList :

    outFp.write(inStr)    # 리스트 요소를 하나씩 가져와 출력 파일에 쓴다.

 

 

6. 이진 파일을 읽거나 쓰는 데 사용하는 함수를 보기에서 모두 고르시오.

 

input(),  read(),  readline(),  print(),  write(),  writeline(),  readlines()

 

Answer

read() 파일의 내용을 처음부터 한 바이트씩 읽는다.

write() # 파일에 한 바이트씩 쓴다. (반복문으로 무한 반복해야 함)

'''

readline(), writelines() 함수는 라인단위로 읽는 텍스트 파일을 처리하므로 사용하지 않는다.

파일을 열거나 닫는 부분은 텍스트 파일과 동일한데, open() 옵션 두 번째 인자에 binary를 뜻하는 b를  같이 준다.

'''

 

 

7. 각 설명에 맞는 os, os.path, shutil 모듈의 함수를 쓰시오.

 

① 파일 복사 = shutil.copy(소스파일, 타깃파일)

② 디렉토리 복사 = shutil.copytree(소스파일, 타깃파일)

③ 디렉토리 생성 = os.mkdir(폴더명)

④ 디렉토리 삭제 = shutil.rmtree(폴더명)

⑤ 폴더 여부 확인 = os.path.exists(파일명 또는 폴더명)

⑥ 파일 삭제 = os.remove(파일명)

 

'''

추가로 더 적어보면

os.walk(폴더) = 디렉토리의 모든 파일 및 하위 디렉토리에 접근 (for문을 이용해 디렉토리 목록 조회 가능)

이 함수는 현재 폴더명, 현재 폴더의 하위 디렉토리 목록, 파일명 목록 3개를 반환한다.

os.path.isfile = 파일인지 확인

os.path.isdir = 폴더인지 확인

os.path.getsize = 파일의 크기 반환

'''

 

 

8. try ~ except 문에서 사용하는 예외 종류를 설명한 것이다. 예외를 쓰시오.

 

① 없는 변수에 접근할 때 = NameError

② 파일 처리에서 오류가 발생할 때 = IOError

③ 실행에서 오류가 발생할 때 = RuntimeError

④ 딕셔너리에 키가 없을 때 = KeyError

 

'''

except 문 뒤에 아무것도 명시하지 않으면 모든 종류의 오류를 처리한다.

이 외에

ImportError = import 문에서 오류가 발생할 때

IndexError = 리스트 등 첨자의 범위를 벗어날 때

KeyboardInterrupt = 프로그램 실행 중 강제 종료를 하고 싶어 Ctrl + C를 누를 때

RecursionError = 재귀 호출의 횟수가 시스템에서 설정한 것보다 넘칠 때

SyntaxError = exec()나 eval()에서 문법상 오류가 발생할 때

TypeError = 변수형의 오류가 발생할 때

ValueError = 함수의 매개변수에 잘못된 값을 넘길 때

ZeroDivisionError = 0으로 나눌 때

'''

 

 

9. 368쪽의 [응용예제 01]에 다음 기능을 추가하시오.

① 오른쪽 파일 리스트 상자에 파일 크기도 함께 표시한다. 1MB 미만은 KB 단위로 출력하고, 1MB 이상은 MB 단위로 출력한다.

② 파일의 확장명에 따라서 색상을 다르게 나타낸다. 실행 파일인 exe, msi 등은 초록색, 그림 파일인 jpg, bmp, png, gif 등은 빨간색, 파이썬 파일인 py는 파란색으로 나타낸다.

from tkinter import *
import os
import os.path

## 전역 변수 선언 부분 ##
window = None
searchDirList = ['C:\\']    # 검색한 폴더 목록의 스택
currentDir = 'C:\\'
dirLabel, dirListBox, fileListBox = None, None, None

## 함수 선언 부분 ##
def clickListBox(evt) :
    global currentDir, searchDirList    # 변경될 전역변수 
    if (dirListBox.curselection() == ()) : # 다른 리스트 box를 클릭할 떄는 무시
        return
    dirName = str(dirListBox.get(dirListBox.curselection())) # 클리한 폴더명
    if dirName == '상위폴더' :
        if len(searchDirList) == 1 : # 상위 폴더를 클릭했는데 현재 C:\\면 무시
            return
        searchDirList.pop() # 상위 폴더 이동이라 마지막 검색 폴더(현재 폴더) pop
    else :
        searchDirList.append(currentDir + dirName + '\\') #검색 리스트에 클릭한 폴더 추가
        
    fillListBox()
        
def fillListBox() :
    global currentDir, searchDirList, dirLabel, dirListBox, fileListBox
    dirListBox.delete(0 ,END)   # 폴더 리스트 box를 비움
    fileListBox.delete(0, END)  # 파일 리스트 box를 비움

    dirListBox.insert(END, "상위폴더")
    currentDir = searchDirList[len(searchDirList) - 1]
    dirLabel.configure(text = currentDir)
    folderList = os.listdir(currentDir)

    index = 0   # 파일 목록 위치
    for item in folderList :
        if os.path.isdir(currentDir + item) :
            dirListBox.insert(END, item)
        elif os.path.isfile(currentDir + item) :
            fileSize = os.path.getsize(currentDir + item)    # 파일 사이즈 저장 (Byte 단위)
            fileName, fileExt = os.path.splitext(item)  # 파일 이름과 확장자를 튜플로 분리

            if fileSize < 1000000 :   # 1MB 미만
                fileSize = fileSize // 1000     # KB 단위로 (소수점 x)
                fileListBox.insert(END, item + "   " + "[" + str(fileSize) + " KB]")
            elif 1000000 <= fileSize :
                fileSize = fileSize // 1000000     # MB 단위로 (소수점 x)
                fileListBox.insert(END, item + "   " + "[" + str(fileSize) + " MB]")

            fileExt = fileExt.lower()     # 대문자 확장자일 경우 소문자로 변환
            if fileExt == '.exe' or fileExt == '.msi' :     # 확장자 별로 분류
                fileListBox.itemconfig(index, foreground = "green")
            elif fileExt == '.jpg' or fileExt == '.bmp' or fileExt == '.png' or fileExt == '.gif' :
                fileListBox.itemconfig(index, foreground = "red")
            elif fileExt == '.py' :
                fileListBox.itemconfig(index, foreground = "blue")
            
            index += 1

## 메인 코드 부분 ##
window = Tk()
window.title("폴더 및 파일 목록 보기")
window.geometry("300x500")

dirLabel = Label(window, text = currentDir)
dirLabel.pack()

dirListBox = Listbox(window)
dirListBox.pack(side = LEFT, fill = BOTH, expand = 1)
dirListBox.bind('<<ListboxSelect>>', clickListBox)

fileListBox = Listbox(window)
fileListBox.pack(side = RIGHT, fill = BOTH, expand = 1)

fillListBox()   # 초기에는 C:\\의 모든 폴더 목록 만들기

window.mainloop()

파일 사이즈와 확장자를 구분해주는 부분을 함수로 만들까 하다가, 그러면 파일 크기나 확장자를 따로 저장하는 list도 만들어야 될 것 같아서, fillListBox() 함수가 처음에 dirListBox와 fileListBox를 초기화한 다음 폴더와 파일 목록을 받아서 넣어주기 때문에 한 번에 다 처리하기 위해서 파일을 fileListBox에 insert할 때 같이 수행되도록 만들었습니다.

 

 

 

728x90
반응형

'python > 파이썬 for Beginner' 카테고리의 다른 글

파이썬 for Beginner Chapter 10  (9) 2019.05.13
파이썬 for Beginner Chapter 09  (2) 2019.04.28
파이썬 for Beginner Chapter 08  (4) 2019.04.28
파이썬 for Beginner Chapter 07  (15) 2019.04.15
파이썬 for Beginner Chapter 06  (0) 2019.04.15
댓글