빅데이터 프로그래밍/Python

[Python] 13. [IO] IO(입출력), File 클래스 다루기, 파일 이동, 디렉토리 조작, 파일 목록, 파일 복사

밍글링글링 2017. 8. 2.
728x90

01. IO(Input Output) Stream 
- 프로그램이 가지고 있는 또는 가지고 있지 않은 데이터를 외부(다른 프로그램)로 

보내거나 가져오는 동작을 말합니다. 
- Program에서 출력 ---------------> 모니터, 디스크 장치, 네트워크, USB, Bluetooth, 출력 스트림, System File, Socket File 
- 키보드, 디스크 장치, 네트워크, USB, Bluetooth  ---------------> Program, 입력, File, Socket File, 입력 스트림 
- 입출력 Stream은 FIFO(First In First Out, 지하철 표를내고 들어가는 
     출입구와 비슷한 구조입니다.(Queue 구조) 
- 스트림은 단방향 구조입니다. 따라서 오로지 출발지와 목적지를 지정하면 
한곳으로만 데이터가 전송됩니다. 
서로 네트워크가 연결되면 Pipeline이 설정되어 보내고 받는 2개의 객체(통로)가 만들어짐. 
- 스트림은 전송하려는 데이터가 많을 경우 지연시간이 발생합니다. 
전철의 지연 운행과 비슷한 동작을 함.
- 전송 제어: 고속 장치와 저속장치가 있는 경우 송수신 장치가 저속으로 
송수신되어 데이터 유실이 발생되지 않도록 함. 
- io는 파이썬에의하여 사용됨으로 패키지명으로 사용 할 수 없음.

1. 파일 다루기

- 자료실에서 견본 이미지 8장을 준비합니다. 'C:/홈 폴더/swiss' 폴더에 저장합니다.

[실행 화면]

1. 파일이 존재합니다.
2. 순수 파일명: F:/201701_python/swiss/sw01
3. 파일 확장자: .jpg
4. 파일 크기: 134 KB
5. 파일인지 검사: True

6. 스크립트를 실행하는 폴더: F:\201701_python\ws_python\oop\oop1
7. 스크립트의 절대경로: F:\201701_python\ws_python\oop\oop1\File1.py
 
8. 파일명 변경: None
9. 파일 삭제: None
11. 파일명 이동: None
12. 이미지 파일 검사
파일명: C:/201705_python/swiss/sw04
확장자: .JPG
이미지 파일입니다.
 
▷ ioexam.File1.py 
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import os

f = 'C:/201705_python/swiss/sw01.jpg'

if (os.path.exists(f)):
    print('1. 파일이 존재합니다.')
    fname, fext = os.path.splitext(f)
    print('2. 순수 파일명: ' + fname)
    print('3. 파일 확장자: ' + fext)
    
    fsize = os.path.getsize(f) # byte
    print('4. 파일 크기: ' + str(int(fsize/1024)) + " KB")
    print('5. 파일인지 검사: ' + str(os.path.isfile(f)))
    
    print()
    print('6. 스크립트를 실행하는 폴더: ' + os.getcwd())    
    print('7. 스크립트의 절대 경로: ' + os.path.abspath(__file__))   
    print()
    
    newf = 'C:/201705_python/swiss/sw01_new.jpg'
    # 정상적으로 변경시 None이 출력됨
    print('8. 파일명의 변경: ' + str(os.rename(f, newf))) 

else:
    '''
    f = 'C:/201705_python/swiss/sw02.jpg'
    print('9. 파일 삭제: ' + str(os.remove(f))) # 정상적으로 삭제시 None이 출력됨
 
    print('10. 파일 생성')
    # 파일 생성, 폴더는 미리 생성되어 있어야함.
    f = open('C:/201705_python/io/test1.txt', 'w')
    f.close()
    
    print('11. 이름 변경')
    src = 'C:/201705_python/swiss/sw03.jpg'
    dest = 'C:/201705_python/io/sw03.jpg'
    print('파일 이동: ' + str(os.rename(src, dest))) # 정상적으로 삭제시 None이 출력됨
    '''
    
    print('12. 이미지 파일 검사')
    src = 'C:/201705_python/swiss/sw04.JPG'
    
    filename, extension = os.path.splitext(src)
    print('파일명: ' + filename)
    print('확장자: ' + extension)
    
    if extension.lower() in '.jpg' or extension.lower() in '.png' or extension.lower() in '.gif' :
        print('이미지 파일입니다.')
    else:
        print('이미지 파일이 아닙니다.')
       
          
-----------------------------------------------------------------------------------
 

 

02. 폴더 생성 및 이름 변경 및 삭제
- mkdir(): 부모 폴더 아래 최하위 폴더 하나만 생성
- mkdirs(): 경로상에 명시된 부모 폴더를 포함하여 모든 폴더를 생성
- src.renameTo(dest): 폴더가 존재하면 폴더명을 변경하지 않음,
  커서가 폴더운에 있으면 Rock이 잠겨 변경 불가능함.
- delete(): 폴더나 파일 즉시 삭제, 하위 폴더가 있으면 삭제 안됨.
- deleteOnExit(): 프로그램 종료시 삭제, 임시 폴더의 사

[실행 화면]

1. 폴더 생성
2. 폴더들 생성
3. 폴더의 이름 변경
4. 폴더의 삭제: None
5. 파일 목록
['data', 'sw', 'sw03.jpg', 'sw04.jpg', 'sw05.jpg', 'sw06.jpg', 'sw07.jpg', 'temp2', 'test1.txt']
 
<class 'list'>
0. sw04.jpg (173 KB)
1. sw05.jpg (504 KB)
2. sw06.jpg (2452 KB)
3. sw07.jpg (568 KB)
4. sw08.jpg (502 KB)
▷ ioexam.File2.py 
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import os, glob

os.chdir('C:/201705_python/io') # 기준 폴더의 지정

print('1. 폴더 생성')
newfolder = 'temp'
if os.path.exists(newfolder) == False:
    os.mkdir(newfolder)
    print('   폴더를 생성했습니다.')
else:
    print('   폴더가 이미 있습니다.')    

print('2. 하위폴더 모두 생성')
newfolder = 'sw/python/scraping'
if os.path.exists(newfolder) == False:
    os.makedirs(newfolder)
    
print('3. 폴더 이름 변경')
folder = 'temp'  # 현재 기준 경로 C:/201705_python/io
foldernew = 'data'
if os.path.exists(foldernew) == False:
    os.renames(folder, foldernew)
    
folder = 'data'
print('4. 폴더의 삭제: ' + str(os.rmdir(folder))) # 정상적으로 변경시 None 출력됨.

print("5. 파일 목록")
folder = 'C:/201705_python/swiss'
file_list = os.listdir(folder)  # list로 리턴
print(file_list)  # ['sw04.jpg', 'sw05.jpg', 'sw06.jpg'...


os.chdir('C:/201705_python/swiss') # 기준 폴더의 지정
print()
files = '*.jpg'
file_list = glob.glob(files)  # jpg 파일만 list로 리턴
print(type(file_list))  # <class 'list'>

length = len(file_list) # list의 요소의 갯수 산출
for index in range(length): # 0~ 갯수 - 1 
    fname = file_list[index]   # 파일 산출
    size =  int(os.path.getsize(fname))  # 파일 사이즈 산출
    size = int(size / 1024+0.5); # 반올림
    print(str(index) + '. ' + fname + ' (' + str(size) + ' KB)')

    

-----------------------------------------------------------------------------------
 
03. Text 파일 복사

- 견본 이미지 1장, 텍스트 파일 1개를 준비합니다. 
- 폴더를 생성 후 txt 와 jpg 파일을 복사해보세요.
- 파일 입출력 모드
  r: 읽기 모드 (디폴트)

  r+: 읽기 + 쓰기 모드
  w: 쓰기 모드
  a: 쓰기 + 이어쓰기 모드
  t: 텍스트 모드 (디폴트)
  b: 바이너리 모드
 

1. Text 파일 준비

▷ C:/작업 기준 폴더/io/news.txt
-----------------------------------------------------------------------------------

심야 콜버스 2016년 7월부터 서울 전역서 운행
-----------------------------------------------------------------
【서울=뉴시스】임재희 기자 = 심야 콜버스가 시범운영을
거쳐 이르면 7월부터 서울 전역에서 운행될 전망이다.

모바일 앱 운영사인 콜버스랩은 시범 운행 등 본 사업과 관련해
서울시 택시운송사업조합과 합의를 마쳤다고 31일 밝혔다.

우선 콜버스랩과 택시조합은 다음달 중순부터 심야 콜버스를
강남·서초·송파구 등 강남권역에서 두달간 운행한다. 
운행시간은 오후 11시부터 다음날 오전 4시까지다.

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

2. Text 파일 복사
1) 하나의 라인 읽고 쓰기 

▷ ioexam.TextCopy.py 
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import os

os.chdir('C:/201705_python/io')

fr = open('news.txt', 'r')
fw = open('news_copyed.txt', 'w')

line = fr.readline()
while line:
    print('%s' %line, end='') # 화면 출력
    fw.write(line) # 파일 출력
    line = fr.readline()

fr.close()
fw.close()
   
-----------------------------------------------------------------------------------
 

2) List를 이용한 하나의 라인 읽고 쓰기 

▷ ioexam.TextCopy2.py 
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-
import os

os.chdir('C:/201705_python/io')  # 현재 기준 폴더 변경

f = open('news.txt', 'r')
data = []  # 읽은 내용을 저장할 list

line = f.readline()
while line:
    print('%s' %line, end='')  # end='': 라인 변경하지 않음, 파일 라인 변경 그대로 처리
    data.append(line)  # list에 추가
    line = f.readline()

f.close()

fw = open('news_list_copyed.txt', 'w')
fw.writelines(data)
fw.close()

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

 

04. Image(Binary 파일)/영화 파일 복사
- rb: binary 파일 읽기
- wb: binary 파일 쓰기

▷ ioexam.ImgCopy1.py 
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import os

os.chdir('C:/201705_python/swiss')  # 현재 기준 폴더 변경

buffersize = 1024

src = open('sw05.jpg', 'rb')           # read binary
dest = open('sw05_copy.jpg', 'wb') # write binary

data = src.read(buffersize)
while data:
    dest.write(data)
    data = src.read(buffersize)

src.close()
dest.close()
     
  
  
-----------------------------------------------------------------------------------
 

 

05. Console에서 실행 옵션을 이용하여 파일명을 전달받아 복사하는 프로그램을 제작하세요.

- sys 모듈을 이용하여 실행 옵션을 입력 가능
- ImgCopy2.py 파일의 확장자를 생략하면 안됩니다.
  python ImgCopy2.py, sw06.jpg, sw06_copy.jpg, sys.argv[0], sys.argv[1], sys.argv[2]

[실행 화면]

/ws_python/oop/ioexam>python ImgCopy2.py sw06.jpg sw06_copy.jpg
###################
###################
############
파일 복사 완료
▷ ioexam.ImgCopy2.py 
-----------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import os, sys

os.chdir('C:/201705_python/swiss')  # 현재 기준 폴더 변경

buffersize = 4096

src = open(sys.argv[1], 'rb')     # read binary
dest = open(sys.argv[2], 'wb')  # write binary

count = 0 # 읽은 횟수 카운트

data = src.read(buffersize)
while data:
    count = count + 1
    dest.write(data)
    data = src.read(buffersize)
    print('#', end='')
    if ((count != 0) and (count % 20)) == 0:
        print()

src.close()
dest.close()
print('\n 파일이 복사되었습니다.')    





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

728x90

댓글