파일 다루기


 지난번에 공부했던 파일을 다루는 방법에대해 알아보겠습니다.

- 파일 목록 얻기


 앞에서는 os모듈의 getcwd() 함수를 이용해서 현재 작업중인 경로를 확인할 수 있었습니다. 이번에는 디렉토리에 존재하는 전체 내용을 list로 반환하는 함수에 대해 알아보겠습니다. os모듈의 listdir() 함수를 이용하면 현재 디렉토리에 존재하는 전체 내용을 리스트로 반환해줍니다.
----------------------------------------------------------------------------------------
import os

print os.listdir('.') # 현재 디렉토리 전체 -> .

print os.listdir('../') # 상위 디렉토리 전체 -> ../

----------------------------------------------------------------------------------------

(실행 결과)

['end.txt', 'file.py', 'inout.py', 'out2.py', 'pickle.py', 'pickle.pyc', 'pickle.txt', 't.txt']

['.project', '.pydevproject', '.settings', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14']
----------------------------------------------------------------------------------------


- 파일 종류 알아보기


 파일의 종류를 알아보는 방법은 os.path 모듈의 세 가지 함수를 이용하는 것입니다. 각각 파일, 디렉토리, 링크파일(윈도우에서는 바로가기, 리눅스/유닉스에서는 심볼링링크 파일) 이면 True를 반환합니다.

----------------------------------------------------------------------------------------

def filetype(fpath): # 세 함수를 사용해서

    print fpath,':',

    if os.path.isfile(fpath): # 파일이면 True

        print "File"

    if os.path.isdir(fpath): # 디렉토리면 True

        print "Directory"

    if os.path.islink(fpath): # 링크파일이면 True

        print "Link File"  

        

list=os.listdir('.') # 현재 경로에있는 모든 파일을 탐색

for fname in list:

    filetype(fname)

----------------------------------------------------------------------------------------

(실행 결과)

end.txt : File

file.py : File

inout - 바로 가기.lnk : File # 왜 링크파일이 아니라 그냥 File로 출력되는 지 모르겠습니다.

inout.py : File

out2.py : File

pickle.py : File

pickle.pyc : File

pickle.txt : File

t.txt : File

----------------------------------------------------------------------------------------


- 파일의 허가권


 리눅스를 공부해본신 분들은 아시겠지만 파일이나 디렉토리에는 읽기, 쓰기, 실행 권한이 있습니다. 이러한 권한을 변경하는 함수가 있습니다. 역시 os 모듈의 chmod() 함수입니다. 리눅스에서 사용하는 chmod와 동일합니다. chmod(파일명,권한)의 형식으로 사용하며, 기본 권한은 755 (rwx-r-x-r-x)입니다. 허가 권은을 알아보는 함수는 access() 함수 입니다. 세부 내용은 아래와 같습니다.
----------------------------------------------------------------------------------------
os.access(filepath,mode)
# mode
- os.F_OK : 파일 자체가 존재하는 지 확인
- os.R_OK : 읽기 권한이 있는 지 확인
- os.W_OK : 쓰기 권한이 있는 지 확인
- os.R_OK : 실행 권한이 있는 지 확인

----------------------------------------------------------------------------------------


 리눅스 처럼 rwx를 출력하는 코드를 짜봤습니다. 함수를 정의 할때에는 줄을 띄어쓰지 않도록 주의해야 합니다.

----------------------------------------------------------------------------------------

import os


def fileaccess(fpath): # 권한을 알아보는 함수 정의

    print fpath,':',

    if os.access(fpath,os.R_OK): # 읽기 권한이 있으면 r출력

        print 'r',

    if os.access(fpath,os.W_OK): # 쓰기 권한이 있으면 w출력

        print 'w',

    if os.access(fpath,os.X_OK): # 실행 권한이 있으면 x출력

        print 'x',

    print

    

flist=os.listdir('.')

for fname in flist:

    fileaccess(fname)

----------------------------------------------------------------------------------------

(실행 결과)

end.txt : r w x

file.py : r w x

inout - 바로 가기.lnk : r w x

inout.py : r w x

out2.py : r w x

pickle.py : r w x

pickle.pyc : r w x

pickle.txt : r w x

t.txt : r w x

----------------------------------------------------------------------------------------


 위의 결과를 보면 전부 기본 권한인 777권한인데요 chmod 함수로 권한을 한번 바꿔보겠습니다. 위의 코드에서 chmod를 사용 한 뒤에 다시 출력을 했을때의 결과입니다.

----------------------------------------------------------------------------------------

os.chmod('t.txt',0555) # r=1, w=2, x=4 

flist=os.listdir('.')

for fname in flist:

    fileaccess(fname)

----------------------------------------------------------------------------------------

t.txt : r x # 권한이 바뀐 걸 확인할 수 있습니다.

----------------------------------------------------------------------------------------


- 파일 조작


1) 파일 이름 변경/이동
 os 모듈의 rename()함수를 이용해 파일 이름을 변경하거나, 이동할 수있습니다.
----------------------------------------------------------------------------------------
os.rename(old_filepath,new_filepath)
old_filepath 에는 경로 뿐만아니라 파일 이름자체를 넣어도 됩니다.

new_filepath 에 새 파일 이름을 넣으면 파일 이름이 변경되고,
    새 파일 이름 앞에 경로까지 넣어주면 파일 이동이 됩니다.
----------------------------------------------------------------------------------------

2) 파일 복사하기
 파일 복사는 shutil 모듈을 활용합니다. shutil 모듈의 copyfile()함수를 이용하면 파일을 복사 할 수 있습니다.
----------------------------------------------------------------------------------------
shutil.copyfile(src_filepath, dest_filepath)
----------------------------------------------------------------------------------------

- 파일 이름 다루기


----------------------------------------------------------------------------------------

1) 상대 경로를 절대 경로로 변환하기

os.path.abspath(상대경로)

# 실제 파일 존재와는 무관하게 절대경로로 변경됨


2) 주어진 경로의 파일이 존재하는지 확인

os.path.exists(filapath)


3) 현재/부모 디렉토리를 가리키는 이름 얻기

os.curdir # 현재 디렉토리

os.pardir # 부모 디렉토리


4) 디렉토리 분리 문자 얻기

os.sep # 이클립스에서는 슬래시(/)

----------------------------------------------------------------------------------------


- 경로명 분리하기


1) 경로와 파일명으로 분리하기

 os.path 모듈의 basename() 함수와 dirname()함수를 이용합니다. 파일의 존재 유무와는 상관이 없습니다.

----------------------------------------------------------------------------------------

import os

f='D:/PythonProject/Python/14/test.py' # test.py는 존재하지 않음

print os.path.basename(f) # 파일명

print os.path.dirname(f) # 디렉토리 경로

----------------------------------------------------------------------------------------

(실행 결과)

test.py

D:/PythonProject/Python/14

----------------------------------------------------------------------------------------


2) 경로명과 파일명을 한번에 분리하기

 os.path 모듈의 split() 함수를 이용하며, 튜플의 형태로 반환됩니다.

----------------------------------------------------------------------------------------

import os

f='D:/PythonProject/Python/14/test.py' # test.py는 존재하지 않음

print os.path.split(f)

----------------------------------------------------------------------------------------

(실행 결과)

('D:/PythonProject/Python/14', 'test.py')

----------------------------------------------------------------------------------------

3) 확장자 분리

 os.path 모듈의 splitext() 함수를 이용하며, 튜플의 형태로 반환됩니다.

----------------------------------------------------------------------------------------
import os

f='D:/PythonProject/Python/14/test.py' # test.py는 존재하지 않음

print os.path.splitext(f)
----------------------------------------------------------------------------------------
('D:/PythonProject/Python/14/test', '.py')
----------------------------------------------------------------------------------------


출처 한국기술교육대학교 온라인평생교육원 파이썬프로그래밍


'언어 > Python' 카테고리의 다른 글

[파이썬] 함수  (0) 2017.03.06
[파이썬] 디렉토리 다루기  (0) 2017.02.25
[파이썬] 파일 입·출력  (0) 2017.02.22
[파이썬] 사전  (0) 2017.02.19
[파이썬] 튜플과 집합자료형  (0) 2017.02.14

+ Recent posts