본문 바로가기
Python

Python - File Write

by DGK 2021. 10. 20.

 

인프런 파이썬 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

File Write

 

  • 기본 개념
# File 기본 개념

# r : 읽기 모드
# w : 쓰기 모드
# a : 추가 모드
# t : 텍스트 모드(기본값)
# b : 바이너리 모드(기본값)

# .. : 상위 폴더로 가는 경로(상대경로)
# . : 현재 폴더의 경로(상대경로)
# /Users/donggyu/Desktop/python_basic : 절대경로




# 읽기(Read) 활용 예시

# 예제1

f = open('/Users/donggyu/Desktop/python_basic/resource/it_news.txt')
# 절대 경로

f = open('./resource/it_news.txt', 'rt', encoding='UTF-8')
# 상대 경로 

# 참고로 상대 경로에서 open( ) 함수의 두 번째 인자로'rt'대신 'r'을 써도 된다.
# 그 이유는 t가 기본 값이므로 생략이 가능하기 때문이다.

# 또한, open( ) 함수의 세 번째 인자인 encoding='UTF-8'은 생략해도 무방하다.
# 파이썬은 기본적으로 UTF-8로 인코딩을 하기 때문이다.


print(dir(f))      # 속성 확인
print(f.encoding)  # 인코딩 확인 : UTF-8
print(f.name)      # 파일 이름 확인 : ./resource/it_news.txt
print(f.mode)      # 모드 확인 : rt(텍스트를 읽어온다는 의미)

cts = f.read()
print(cts)

# read( ) 함수는 텍스트의 내용을 읽어와서 출력한다.

f.close()

# 파일을 열었으면, close( ) 함수로 반드시 닫아야 한다.(리소스 낭비 방지)



# 예제2

with open('./resource/it_news.txt', 'rt', encoding='UTF-8') as f:
    c = f.read()
    print(c)		# 텍스트의 내용을 읽어와서 출력함
    print(iter(c))	# <str_iterator object at 0x10d2f3b50> 
    print(list(c))	# 텍스트의 모든 내용을 한 글자 단위로 리스트에 넣어 출력함
    
# with문과 alias를 통해 보다 간결한 코드를 작성할 수 있다.(동일한 읽기 기능)
# with문에서는 f.close( ) 코드로 파일을 닫지 않아도 된다.



# 예제3

# read( ) : 전체 텍스트를 읽어온다.
# read(10) : 10byte의 크기만큼만 텍스트를 읽어온다.
# 즉, read( ) 안에 인자를 넣어주면, 해당 인자의 byte 크기 만큼만 텍스트를 읽어온다.


with open('./resource/it_news.txt', 'rt', encoding='UTF-8') as f:
    c = f.read(20)
    print(c)		# 결과 : Right now gamers can
    c = f.read(20)
    print(c)		# 결과 : pay just $1 for acc
    f.seek(0,0)		# 커서 초기화 
    c = f.read(20)
    print(c)		# 결과 : Right now gamers can
    
# f.read(20)코드는 텍스트 파일의 내용을 20byte 크기만큼만 읽어오겠다는 의미이다.

# 텍스트 내용일 읽어온 상태에서 다시 한 번 텍스트 파일의 내용일 읽어올 경우,
# 처음 20byte만큼 출력된 부분의 마지막부분에 이어서 20byte의 내용을 읽어온다.

# f.seek(0,0)코드는 읽어오는 부분을 처음으로 초기화시킨다.(커서의 초기화)
# 즉, 텍스트에서 커서를 조정할 수 있는 기능이다.(인자 0,0은 from : 0, to : 0 의미) 



# 예제4

# readline( ) : 텍스트 내용을 한 줄씩 읽어온다.

with open('./resource/it_news.txt', 'rt', encoding='UTF-8') as f:
    line = f.readline()
    print(line)         # 결과 : 텍스트 내용의 첫 번째 줄을 읽어온다.
    line = f.readline()
    print(line)         # 결과 : 텍스트의 그 다음 줄을 읽어온다.

# f.readline( ) 함수의 코드를 연달아 작성하면, 
# 텍스트의 첫 번째 줄을 읽어온 후에, 이어서 텍스트의 두 번째 줄을 읽어온다.



# 예제5

# readlines( ) : 텍스트 전체를 읽은 후, 리스트에 라인별로 내용을 저장하고 읽어온다.

with open('./resource/it_news.txt', 'rt', encoding='UTF-8') as f:
    cts = f.readlines()
    print(cts)		  # 텍스트 내용을 라인별로 리스트에 정리하여 출력함

    for c in cts:
        print(c, end='')  # 리스트 형태의 내용을 다시 원문형태로 복원하여 출력함




# 파일 쓰기(Write)

# 예제1

with open('./resource/contents1.txt', 'wt') as f:       
    f.write('I love Python\n')
    
# 결과 : contents1.txt 파일에 'I love Python'의 문자열 내용을 쓸 수 있다.
# 참고로 상대 경로에서 open( ) 함수의 두 번째 인자로'wt'대신 'w'을 써도 된다.
# 그 이유는 t가 기본 값이므로 생략이 가능하기 때문이다.



# 예제2

with open('./resource/contents1.txt', 'wt') as f:
    f.write('I love Python2\n')                           

# 결과 : 
# contents1.txt 파일의 텍스트 내용이 문자열 I love Python에서
# 문자열 I love Python2로 바뀐다.


with open('./resource/contents1.txt', 'a') as f:
    f.write('I love Python3\n')   
    
# 결과 : 
# contents1.txt 파일의 기존 텍스트 내용(I love Python2)에
# 문자열 I love Python3이 추가된다.
# open( ) 함수의 두 번째 인자인 w와 a는 기능의 차이점이 존재한다.(중요) 



# 예제3

# writelines( ) : 리스트 자료형의 요소를 파일의 텍스트 내용에 쓴다.

with open('./resource/contents1.txt', 'a') as f:
    list = ['Orange\n', 'Apple\n', 'Banana\n', 'Melon\n']
    f.writelines(list)
    
# 결과 : 
# Orange
# Apple
# Melon



# 예제4

with open('./resource/contents3.txt', 'a') as f:
    print('Test Text Write!', file = f)
    print('Test Text Write!', file = f)
    print('Test Text Write!', file = f)

# 결과 : print문의 내용을 터미널창이 아닌 파일의 텍스트 내용에 쓸 수 있다.

 

 

  • 응용 개념
# CSV 파일 활용 예시

# CSV 파일 읽기(Read)

# 예제1

import csv


with open('./resource/test1.csv', 'r', encoding='UTF-8') as f:
    reader = csv.reader(f)

    next(reader)            # Header skip
    print(reader)           # 객체 확인
    print(type(reader))     # 타입 확인
    print(dir(reader))      # 속성 확인(반복문에서도 사용 가능 : __iter__)

    for c in reader:
        print(c)	      # 결과 : list 형태로 파일 내용을 출력함
        print(type(c))        # 결과 : <class 'list'>
        print(' : '.join(c))  # list 형태의 내용을 원하는 형식으로 변환함
        
        
# for문에서 reader( ) 함수를 함께 사용하면,
# 특정 기호로 구분된 CSV 파일의 내용을 읽어와서 리스트 형태로 반환한다.

# next(reader)의 코드는 CSV 파일의 Header 값을 스킵해준다.(Name,Code이 스킵됨)
# 즉, 파일을 읽어오는 커서가 한 칸 아래로 이동한다고 이해해도 무방하다.
# open( ) 함수의 인자인 encoding='UTF-8'를 생략해도 된다.(기본 값 : UTF-8)
# join( ) 함수를 사용해서 리스트 형태의 출력된 내용을 원하는 형식으로 바꿀 수 있다.


# 예제2

with open('./resource/test2.csv', 'r', encoding='UTF-8') as f:
    reader = csv.reader(f, delimiter= '|')      
    for c in reader:
        print(c)	# 결과 : list 형태로 파일 내용을 출력함
        
# reader = csv.reader(f, delimiter= '|') 코드에서 delimiter= '|'는 
# 구분자를 의미하며, 기호 '|'를 기준으로 CSV 파일의 내용을 리스트 형태로 구분하여
# 반환한다.



# 예제3

with open('./resource/test1.csv', 'r', encoding='UTF-8') as f:
    reader = csv.DictReader(f)	  # 딕셔너리형태로 읽어옴 
    
    print(reader)	    # 객체 확인
    print(type(reader))     # <class 'csv.DictReader'>
    print(dir(reader))      # __iter__ 존재(반복문에서 사용 가능)

    for c in reader:
         print(c)           # 결과 : 딕셔너리 형태로 파일의 내용을 출력함

# DictReader( ) 함수를 사용하면 CSV 파일의 내용을 딕셔너리 형태로 읽어와서 반환한다.


    for c in reader:
        for k, v in c.items():	
            print(k,v)
        print('------------------')
        
# 결과 :
# Name Afghanistan
# Code AF
# ------------------
# Name Åland Islands
# Code AX
# ------------------
# Name Albania
# Code AL
# ------------------
# Name Algeria
# Code DZ
# ------------------
# ...

# items( ) 함수를 사용해서 키와 벨류를 반환할 수 있다.




# CSV 파일 쓰기(Write)

# 예제1

w = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]

with open('./resource/write1.csv', 'w', encoding='UTF-8') as f:
    print(dir(csv))     # 속성 확인
    
    wt = csv.writer(f)
    print(dir(wt))      # 속성 확인
    print(type(wt))     # 타입 확인

    for v in w:
        wt.writerow(v)   
   
# 결과 :
# 1,2,3
# 4,5,6
# 7,8,9
# 10,11,12
# 13,14,15
# 16,17,18
     
     
# writerow( ) 함수를 사용하여 리스트 자료형을 CSV 파일로 만들 경우,
# 전체 리스트의 각 요소들이 1줄씩 CSV파일의 내용으로 쓰여진다.
# 여기서 전체 리스트의 각 요소들은 [1,2,3], [4,5,6]....를 의미한다.



# 예제2

with open('./resource/write2.csv', 'w', encoding='UTF-8') as f:
    fields = ['One', 'Two', 'Three']    # 필드명 정의

    wt = csv.DictWriter(f, fieldnames=fields)       
    wt.writeheader()	

    for v in w:
        wt.writerow({'One': v[0], 'Two': v[1], 'Three': v[2]})
        
# 결과 : 
# One,Two,Three
# 1,2,3
# 4,5,6
# 7,8,9
# 10,11,12
# 13,14,15
# 16,17,18

       
# DictWriter( ) 함수를 사용하면 CSV 파일의 내용에 딕셔너리 형태로 쓰여진다.
# 또한, DictWriter( ) 함수의 두 번째 인자는 앞서 정의한 필드명을 필드이름으로
# 사용하는 것을 의미한다.
 
# writerow( ) 함수를 사용하기 때문에 앞선 예시와 동일하게 리스트 자료형의
# 각 요소들이 1줄씩 CSV 파일의 내용으로 쓰여지는 것이다.

# wt.writeheader( ) 함수를 사용하면 앞서 정의한 필드명이 CSV파일의
# Header로 사용된다.

'Python' 카테고리의 다른 글

Python - crawling pattern  (0) 2021.10.28
Python - 기본 문법(추가내용)  (0) 2021.10.21
Python - External functions  (0) 2021.10.18
Python - Built in functions  (0) 2021.10.18
Python - Exception  (0) 2021.10.18

댓글