Python/Syntax
2021. 8. 24. 13:18
파일
파일 입출력
- 윈도우에서는 파일 경로를 구분할 때
\\
로 작성하는게 맞지만, 파이썬에서는/
를 쓰더라도 처리해주므로 OS에 독립적으로 작성할 수 있다.
파일 열기
open(파일경로, 모드[, encoding="문자셋"])
모드
모드 설명 r 읽기, 파일이 없는 경우 예외 발생 w 쓰기, 파일이 없으면 새로 생김 a 추가 x 쓰기용으로 여나 기존 파일이 있는 경우 실패 t text 모드로 열기 (기본값) b binary 모드로 열기
파일 쓰기
write(데이터)
f = open("live.txt", "wt", encoding="UTF-8") f.write("""삶이 그대를 속일지라도 슬퍼하거나 노하지 말라! 우울한 날들을 견디면 믿으라, 기쁨의 날이 오리니""") f.write("\n추가1") f.write("\n추가2") f.write("\n추가3") f.close()
파일 읽기
메서드
메서드 설명 .read() 파일 전체 내용 .read(n) n개의 내용 (바이너리 모드일 땐 바이트, 텍스트 모드일 땐 글자 수) .readline() 한 줄 (끝에 개행 문자 포함) .readlines() 전체 라인 리스트 (각 라인 끝에 개행 문자 포함) 예제
f
를 처음에None
으로 대입해야f.close()
의 조건을 설정할 수 있다.try: f = None f = open("live.txtd", "rt", encoding="UTF-8") text = f.read() print(text) except FileNotFoundError: print("파일이 없습니다.") finally: if f: f.close() ''' stdout 삶이 그대를 속일지라도 슬퍼하거나 노하지 말라! 우울한 날들을 견디면 믿으라, 기쁨의 날이 오리니 추가1 추가2 추가3 '''
with
with
블록이 끝났을 때 해당 객체의close()
를 자동 호출한다.I/O 처리나 통신 관련 작업 시 유용하다.
try: with open("live.txt", "rt", encoding="UTF-8") as f: text = f.read() print(text) except Exception as e: print(e)
for 문에 바로 넣을 수도 있다.
with open("live.txt", "rt", encoding="UTF-8") as f: for line in f: print(line, end="")
입출력 위치
.seek(위치, 기준)
위치 (offset)
기준으로부터 얼마나 떨어진 곳인지 바이트 단위로 지정한다.
한글의 경우 주의해야 한다.
얼라인이 맞지 않으면
UnicodeDecodeError
에러가 발생한다.따라서 주로 바이너리 파일을 다룰 때 사용한다.
기준
기준 설명 0 파일의 처음 위치 1 현재 위치 2 파일의 끝 위치
live.txt
삶이 그대를 속일지라도 슬퍼하거나 노하지 말라! 우울한 날들을 견디면 믿으라, 기쁨의 날이 오리니
with open("live.txt", "rt", encoding="UTF-8") as f: f.seek(12, 0) text = f.read() # 예외 발생
.tell()
- 현재 파일 포인터의 위치를 정수형으로 반환한다.
내용 추가
w 모드 (
fp
가 0)- 기존 파일이 존재하는 경우, 내용을 모두 지우고 다시 작성한다. (덮어쓰기)
a 모드 (
fp
가 파일의 끝)- 기존 파일이 존재하는 경우, 파일의 끝에 내용을 추가한다. (이어쓰기)
파일 관리
파일 관리 함수
함수 설명 shutil.copy(a, b) 파일 복사 shutil.move(a, b) 파일 이동 shutil.rmtree(path) 디렉터리 트리 삭제(주의) shutil.chown(f, u, g) 소유자 변경 os.rename(a, b) 이름 변경 os.remove(f) 파일 삭제 os.chmod(f, m) 권한 변경 os.link(a, b) a를 가리키는 b라는 이름의 하드 링크 생성 os.symlink(a, b) 심볼릭 링크 생성 디렉토리 관리 함수
함수 설명 os.chdir(path) 현재 워킹 디렉토리를 path로 변경 os.mkdir(path[, mode=0o777, dir_fd=None]) mode 권한으로 path 디렉터리를 생성 os.rmdir(path[, dir_fd=None]) 디렉토리 path 제거 os.getcwd() 현재 워킹 디렉토리 반환 os.listdir(path='.') path 디렉토리에 있는 항목들의 이름을 담고 있는 리스트 반환, .
와..
는 포함하지 않음glob.glob(pathname) pathname(패턴)에 해당하는 파일 리스트 반환 os.path.isabs(path) path가 절대 경로면 True os.path.abspath(path) path의 절대 경로를 반환 os.path.realpath(path) path의 경로에서 심볼릭 링크를 제거해서 반환 os.path.exists(path) path가 존재하는 경로나 열려있는 파일 디스크립터면 True os.path.isfile(path) path가 존재하고 일반 파일이면 True os.path.isdir(path) path가 존재하고 디렉토리이면 True 예시
디렉토리 관리
import os from pprint import pprint # 지정한 확장명을 가지는 파일명 목록을 리턴하는 함수 def get_files(dir_path, ext): files = os.listdir(dir_path) cwd = os.getcwd() print(f"cwd : {cwd}") # 0. 일반 순회 file_list = [] for f in files: fpath = os.path.join(cwd, f) print(fpath) if (os.path.isfile(fpath)) and (fpath.endswith(ext)): file_list.append(fpath) return file_list # 1. filter 함수 적용 files = map(lambda fname: os.path.join(cwd, fname), files) file_list = list(filter(lambda fname: fname.endswith(ext), files)) return file_list # 2. 컴프리헨션 return [os.path.join(cwd, fname) for fname in files if fname.endswith(ext)]
file_list = get_files('.', '.txt')
pprint(file_list)
```
```py
# ---- 요구 사항 예시 ----
# 파일 목록
# 1) addressbook copy.txt
# 2) addressbook.txt
# 3) live.txt
# 4) live2.txt
# 5) memo.txt
#
# 파일 선택 : 3
# live.txt 내용을 출력
#
# 파일 선택 : -1
# 종료
# -----------------------
import os
def get_files(dir_path, ext):
return [fname for fname in os.listdir(dir_path) if fname.endswith(ext)]
def print_file_list(files):
print("\n\n--- 파일 목록 ---")
for idx, fname in enumerate(files, 1):
print(f"{idx}) {fname}")
print()
def print_file(file_name):
try:
with open(file_name, "rt", encoding="UTF-8") as f:
text = f.read()
print(text)
except Exception as e:
print(e)
while (True):
txt_list = get_files('.', '.txt')
print_file_list(txt_list)
selected_no = int(input("파일을 선택하세요 : "))
if (selected_no == -1):
print("종료합니다.")
break
print_file(txt_list[selected_no - 1])
```
참고
'Python > Syntax' 카테고리의 다른 글
파이썬 고급 문법 (0) | 2021.08.24 |
---|---|
파이썬 모듈과 패키지 (0) | 2021.08.24 |
파이썬 예외 처리 (0) | 2021.08.24 |
파이썬 표준 모듈 (0) | 2021.08.24 |
파이썬 컬렉션 관리 (0) | 2021.08.24 |