본문 바로가기
컴퓨터 프로그래밍/python

Python 파일 (file)

by JaeBaek 2020. 8. 14.

directory (Wikipedia)

■ 파일 입출력 (file Input and output)

★ 파일 쓰기 (write)

프로그램의 정보를 영구적으로 저장할 때는 파일에 기록을 합니다. 기본적인 입출력 기능은 C와 마찬가지로 유닉스 것과 같고, C 익숙하신 분들이라면 간단하게 배우실거라 생각합니다. 먼저 오픈이라는 과정을 준비하여야 하는데 오픈이란 파일 입출력을 위해서 위치를 확인하고 버퍼를 준비하는 것을 말합니다. 

open(파일경로, 모드)

여기서 파일경로는 입출력 대상 파일의 이름이고, 디렉토리 경로를 포함할수 있고 파일명이 있으면 현재 디렉토리에서 찾을 수 있습니다. 그리고 모드는 읽기, 쓰기, 추가 등 파일로 무엇을 할 것인가를 지정하여 읽을 파일이 없거나 생성할 파일이 이미 있을 때의 처리 방식을 결정합니다. 

 

모드 종류

모드 설명
r 파일을 읽고, 없을 경우 예외 발생
w 파일에 기록, 파일이 있는 경우 덮어씀
a 파일에 데이터를 추가한다.
x 파일에 기록하되 파일이 이미 있으면 실패한다.

 

모드 뒤에는 파일의 종류를 지정하는 문자를 씁니다. t는 텍스트 파일, b는 이진 파일입니다. 예를들어서 텍스트파일 기록을 하고 싶다면 "wt"라고 적으면 되겠죠. 그리고 디폴트 모드는 텍스트 파일 읽기 모드인 "rt"입니다.

파일 입출력 절차

write

f=open("shawn_mendes__mercy.txt","wt")

f.write("""Please have mercy on me

Take it easy on my heart

Even though you don't mean to hurt me

You keep tearing me apart

Would you please have mercy, mercy on my heart""")

f.close()

result

탐색기를 통해서 파일 제목을 찾으면 txt파일로 저장이 된 것을 확인 할 수 있다.

 

 

★ 파일 읽기 (read)

파일을 읽는 가장 편한 방법은 read 함수를 이용하는 것입니다. 생성한 shawn_mendes__mercy.txt 파일을 읽어 출력을 해보겠습니다. 지난 시간에 배운 예외 처리를 함께 사용하여 파일이 없는 경우를 추가하겠습니다.

read

try:

    f=open("shawn_mendes__mercy.txt","rt") # txt파일을 불러와 f라는 변수에 저장

    text=f.read()

    print(text)

except FileNotFoundError:

    print("There is no file")

finally:

    f.close()

result

Please have mercy on me
Take it easy on my heart
Even though you don't mean to hurt me
You keep tearing me apart
Would you please have mercy, mercy on my heart

 

한 문장씩 번호를 붙여가며 출력을 하는 코드를 작성해보도록 하겠습니다.

# 1

readline - 한줄씩 출력

f=open("shawn_mendes__mercy.txt","rt")

text=""

line=1

while True:

    row=f.readline()

    if not row: break

    text+=str(line) +" : "+row

    line +=1

f.close()

print(text)

result

1 : Please have mercy on me
2 : Take it easy on my heart
3 : Even though you don't mean to hurt me
4 : You keep tearing me apart
5 : Would you please have mercy, mercy on my heart

# 2

readfile - 파일자체에서 출력

f=open("shawn_mendes__mercy.txt","rt")

for i in f:

    print(i,end='')

f.close()

result

Please have mercy on me
Take it easy on my heart
Even though you don't mean to hurt me
You keep tearing me apart
Would you please have mercy, mercy on my heart

 

★ 입출력 위치

입출력 위치를 바꿔가며 파일의 우너하는 부분을 자유롭게 액세스하느 방식을 임의 접근이라고 합니다. 현재 입출력 위치를 조사할 때는 tell 함수를 호출하고 위치 변경시 seek 함수를 사용합니다.

seek(위치, 기준)

여기서 기준이 0이며 파일 처음부터이고, 2이면 끝에서부터, 1이면 현재 위치를 기준으로 합니다. 

file_object.tell( )

 

seek

f=open("shawn_mendes__mercy.txt","rt")

f.seek(12,0)

text=f.read()

f.close()

print(text)

result

mercy on me
Take it easy on my heart
Even though you don't mean to hurt me
You keep tearing me apart
Would you please have mercy, mercy on my heart

위 결과를 보면 알 수 있듯이 원래 첫 문장은 Please have mercy on me인데 Please have가 빠진 것을 알 수 있습니다. 이렇게 사용자가 원하는 위치에서의 값을 불러 오도록 할 수도 있습니다. 

 

 

★ 내용 추가

제일 위쪽의 모드 표를 보면 알 수 있듯이 'a'는 기존의 내용을 그대로 유지하고 뒤에 덧붙이며 이를 위해 파일을 열자마자 입출력 위치를 파일의 제일 끝으로 보내는 역할을 합니다. 예시와 함께 출처를 밝히는 문장을 추가해보도록 하겠습니다.

append

f=open("shawn_mendes__mercy.txt","at")

f.write("\n\nsong by shawn mendes")

print(f)

f.close()

결과

 

※ 파일 입출력이 끝나면 close 함수로 닫아야 합니다. 혹시나 까먹고 close 함수를 사용하지 않아도 프로그램 종료시 자동으로 닫히긴 하지만 연속적인 파일 사용에 있어서는 파일을 꼭 닫아주어야 합니다. 하지만 항상 close() 를 사용하는 것은 많이 귀찮은 일일 수 있습니다. 이런 경우에는 with 블록을 사용하면 됩니다.

ex) 간단한 예시

with open("shawn_mendes.txt","rt") as f:

    text=f.read()

print(text)

 

■ 파일 관리 (file management)

★ 파일 관리 함수

위에서 나온 파일 입출력 함수는 파일에 저장된 내용을 다루는 기능을 보았습니다. 그에 반면 파일 관리 함수는 파일 자체를 다룬다고 생각하시면 될 것 같습니다. 

함수 설명
shutil.copy(a,b) 파일 복사
shutil.copy(a,,b) 디렉토리를 복사. 서브 디렉토리까지 전부 복사
shutil.move(a,b)
파일 이동
shutil.rmtree(path)
디렉토리를 삭제
os.rename(a,b) 파일 이름 변경
os.remove(f) 파일 삭제
os.chmod(f,m) 파일의 퍼미션 변경
shutil.chown(f,u,g)
파일의 소유권 변경
os.link(a,b) 하드 링크로 생성
os.symlink(a,b) 심볼릭 링크 생성

 

★ 디렉토리 관리 함수 (directory)

디렉토리란 파일을 저장하는 곳 입니다. 각각의 디렉토리끼리 계층을 이루어 복잡한 파일 시스템을 구성합니다. 

함수 설명
os.chdir(d) 현재 디렉토리 변경
os.mkdir(d) 디렉토리 생성
os.rmdir(d) 디렉토리 제거
os.getcwd() 현재 디렉토리 조사
os.listdir(d) 디렉토리의 내용 나열
glob.glob(p) 패턴과 일치하는 파일의 목록을 나열

 

파일의 생성과 이름 변경, 삭제 기능은 쉽게 할 수 있지만 디렉토리 경로가 여러 개의 요소로 구성된 포맷이어서 정확하게 다루는 것은 까다롭습니다. 따라서 os.path 모듈에는 디렉토리에 대한 다양한 함수가 제공이 됩니다.

함수 설명
os.path.isabs(f) 절대 경로인지 조사
os.path.abspath(f) 파일의 절대 경로를 구함
os.path.realpath(f) 원본 파일의 경로를 구함
os.path.exists(f) 파일의 존재 여부 조사
os.path.isfile(f) 파일인지 조사
os.path.isdir(f) 디렉토리인지 조사

 

위 기능들을 중에서 listdir 기능 하나를 예시로 들어보겠습니다.

listdir  

먼저 c drive에 test파일을 만든 후 노래 2곡을 넣겠습니다. 
그리고 소스코드를 작성하면

import os

files=os.listdir("c:\\test")

for f in files:

    print(f)

result DOCTOR VOX - Frontier [Bass Boosted -HQ] (Copyright Free Music).m4a
Janji - Heroes Tonight (feat. Johnning) [NCS Release].m4a

 

위 결과처럼 간단히 어떤 파일이 있는지 조사를 할 수 있습니다. 

또한 다른 기능들을 모두 적절히 활용을 한다면 수작업일 경우 몇시간이 걸릴 작업을 잘 짜여진 코드 단 몇줄로 단숨에 해결이 가능합니다. 각각의 기능들 모두 적절하게 사용을 해보고 적응하시길 바랍니다.

 

'컴퓨터 프로그래밍 > python' 카테고리의 다른 글

Python 모듈, 패키지  (0) 2020.08.16
Python 클래스 (Class)  (0) 2020.08.16
Python 예외 처리 (exception process)  (0) 2020.08.14
Python 표준 모듈  (0) 2020.08.13
Python 컬렉션(Collection)  (0) 2020.08.13

댓글