티스토리 뷰
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할 때 같이 수행되도록 만들었습니다.
'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 |
- Total
- Today
- Yesterday
- git branch
- Computer_Networking_A_Top-Down_Approach
- Spring Data JPA
- 생활코딩 javascript
- 방명록 프로젝트
- 김영환
- 프로그래머스
- spring mvc
- Gradle
- 패킷 스위칭
- 쉽게 배우는 운영체제
- 선형 회귀
- 쉘 코드
- git merge
- 스프링 테스트
- 파이썬 for Beginner 솔루션
- 파이썬 for Beginner 연습문제
- 스프링 mvc
- Do it! 정직하게 코딩하며 배우는 딥러닝 입문
- JPA
- Python Cookbook
- 지옥에서 온 git
- jsp
- git
- 스프링
- 스프링 컨테이너
- Thymeleaf
- Spring
- Spring Boot
- 운영체제 반효경
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |