본문 바로가기
목차
Python

[Python] Text File: read and write

by ds31x 2023. 7. 4.
728x90
반응형

Python에서 Text File을 읽고 쓰는 것은 io.TextIOWrapper 객체를 이용하며 문자 기반의 stream 으로 이루어짐.

개행문자를 기반으로 flush가 이루어지는 line_buffering을 사용 가능함 (line_buffering=True 로 설정시).

시작하기 앞서 참고 자료:

2024.01.07 - [개발환경] - [CE] Text file: Text 파일이란?

 

[CE] Text file: Text 파일이란?

"text file" 은사람과 컴퓨터가 읽을 수 있고 처리할 수 있도록 encoding 된 characters 로 이루어진electric text lines 로 구성되는 형태의파일 포맷 및 해당 파일을 가르킴.https://dsaint31.me/mkdocs_site/CE/ch01/code_

ds31x.tistory.com


Text file을 open 할 때, encoding 을 키워드로 오픈할 파일의 인코딩을 지정할 수 있음.

f = open('bin2txt.txt', 'rt', encoding='ascii', errors='ignore')

 

2024.01.16 - [Python] - [Python] Unicode and Python: encode and decode

 

[Python] Unicode and Python: encode and decode

encode : str 에서 bytes 로decode : bytes 에서 str 로 이때 encoding 방식이 필요하며,해당 encoding 방식에 따라 동일한 str 객체라도 다른 bytes 객체로 변환된다.참고로, str 객체가 같은 경우엔 Unicode의 codepoin

ds31x.tistory.com


추가적으로 line_bufferingwrite_through 키워드 파라미터를 설정가능:

  • line_buffering=True 를 추가할 경우, 개행문자를 만나는 경우 자동 flush되는 line buffering 이 켜짐.
  • write_through=True 를 추가할 경우, 내부 buffer를 우회하여 즉시 하위버퍼(file)로 쓰기가 이루어짐.

 


1. 쓰기 (Write)

open으로 얻은 file object의 메서드 write 또는 print 함수를 통해 쓰기를 수행함.

  • 당연히 해당 file object는 wt or w 등과 같이 Text file로 쓰기 (or a or x)등으로 열려야 함.
  • 'x' 로 파일을 열면, 지정한 파일이 존재하지 않을 때만 새로 파일을 생성하고, 생성한 파일을 쓰기 모드인 점 주의.

2023.07.04 - [Python] - [Python] file : open and close

 

[Python] file: open and close

Python 에서 file을 처리하기 위해선 다른 프로그래밍 언어와 마찬가지로 file에 대한 접근이 가능한 object를 얻어와야함.이같은 object는 file object, file handler, file descriptor 등의 여러 이름으로 불리며,P

ds31x.tistory.com


1-1. print() 함수

print 함수의 경우, standard output (stdout, 일반적으로 terminal)로 출력을 하는 것이 기본동작이나,

  • file parameter로 쓰고자 하는 file object를
  • keyward argument로 할당해 준 경우 파일에 출력이 이루어짐.

 

sep=' '라던지 end=\n' 등의 parameter들은 stdout에 출력할 때와 같으므로,

특별히 지정하지 않는 한, argument들을 사이에 space가 추가되고 newline이 붙어서 출력이 이루어짐.

print()
한 line을 출력하는 것을 기본 동작으로 하고 있음을 명심할 것.

다음 예제로 사용 방법을 확인하자.

with open('test0.txt','w') as fout:
    print('Test! This is a single line.',file=fout)

 

참고: stream이란

2024.09.11 - [CE] - [CE] Stream이란

 

[CE] Stream이란

Stream:데이터를 연속적으로 흐르는 방식으로 처리한다는 개념으로,데이터의 입출력을 일종의 bit (or byte) 들의 흐름으로 여겨서 처리하는 것으로 생각하고이와 같은 방식으로 I/O가 이루어지는 대

ds31x.tistory.com


2-2. write() 메서드

write()메서드는 text mode에서 파일에 쓴 character(글자)의 수를 반환함.

txt = '''First line of text
Second line of text
Third line of text'''

with open('test1.txt','w') as fout:
    cnt = fout.write(txt)
    print(f'write : {cnt} characters.')
  • 주의할 것은 write 메서드는 맨 뒤에 newline을 추가하지 않음.
  • 있는 그대로 argument로 받은 string을 file에 씀.
  • 위의 예의 경우, multi-line string이므로 1,2번째 행들의 맨 끝에는 newline이 있음.

참고로 binary file의 경우에는 write
파일에 쓴 byte 수를 반환함.

 

만약 파일에 써야할 text가 매우 큰 경우에는 이를 다음과 같이 chunk로 나누어 처리하는게 일반적임.

txt = '''First line of text
Second line of text
Third line of text'''

with open('test2.txt','w') as fout:
    chunk = 10
    offset = 0
    max_size = len(txt)
    while offset <= max_size:
        print(f'num of character written : {fout.write(txt[offset:offset+chunk])}')
        offset += chunk

3. 읽기 (read)

open으로 얻은 file object가 제공하는 다음의 메서드들을 통해 읽기를 처리함.

  • read : 통으로 한 번에 읽어들이거나 정해진 글자수(argument로 지정)만큼 읽어들이고, 읽어들인 문자열을 반환.
    • 빈파일이거나 EOF도달시 empty string 객체 반환.
  • readline : 한 line을 읽어들이고 해당 line에 해당하는 문자열을 반환.
    • 읽어들인 line에 newline으로 끝날 경우, 반환된 문자열도 newline 을 끝에 가지고 있음.
    • 빈파일이거나 EOF도달시 empty string 객체 반환
  • readlines : 한번에 file을 여러 라인들을 읽어들여 각 line을 item으로 가지는 list를 반환.
    • 각 item들에는 newline 이 포함됨.
    • 빈파일인 경우 empty list 반환.

3-1. read()

read()메소드는 arugment 없을 경우 파일 전체를 읽어들이고, int로 argument를 줄 경우 해당 숫자의 글자를 읽어들임.

  • EOF(End of File)에 도달하여 더 이상 읽을 문자가 없을 경우, 빈문자열을 반환함.

다음 예를 참고.

txt = str()
with open('test2.txt', 'rt') as fin:
    txt = fin.read()

print(txt)

위의 경우, 한번에 전체 파일을 읽어들이기 때문에 매우 큰 사이즈의 파일을 읽을 때는 아래와 같이 나누어서 읽어들이는게 일반적임.

txt = str()
with open('test2.txt', 'rt') as fin:
    chunk = 10
    while buf := fin.read(chunk):
        txt += buf
print(txt)

3-2. readline()

한 line씩읽어들임.

  • EOF(End of File)에 도달하여 더 이상 읽을 문자가 없을 경우, empty string(빈문자열)을 반환함.
txt = str()
with open('relativity', 'rt') as fin:
    while line := fin.readline():
        txt += line        
print(txt)

3-3. readlines()

각 line을 item으로 가지는 list를 반환.

lines = None
with open('relativity', 'rt') as fin:
    lines = fin.readlines()

print(len(lines), 'lines read')
for line in lines:
    print(line, end='')
print('')

print('--------------')
tmp = ''.join(lines)
print(tmp)

참고: file object 자체가 iterator임.

open으로 반환되는 file에 대한 객체는 _io.TextIOWrapper자체가 iterator임.

때문에 다음과 같이 for문으로 각 line별로 읽어들이는 게 가능함.

txt = str()
with open('relativity', 'rt') as fin:
        for l in fin:
            txt += l
print(txt)

binary file의 읽기 쓰기도 text file의 경우와 거의 비슷함.

 

다음 URL참고.

2023.07.04 - [Python] - [Python] binary file : write and read

 

[Python] binary file : write and read

txt file과 거의 비슷하나, 다음의 차이를 보임. 파일 내용을 담는데 사용하는 class가 str을 주로 쓰는 txt file의 경우와 달리 bytes와 bytearray를 사용한다. bytes는 immutable이고, bytearray는 mutable인 점을 기

ds31x.tistory.com


관련자료

2023.12.05 - [Python] - [Python] File Handling

 

[Python] File Handling

File 열고 닫기. 2023.07.04 - [Python] - [Python] file : open and close [Python] file : open and close Python 에서 file을 처리하기 위해선 다른 프로그래밍 언어와 마찬가지로 file에 대한 접근이 가능한 object를 얻어와

ds31x.tistory.com

https://dsaint31.me/mkdocs_site/CE/ch01/code_for_character/

 

BME228

Codes for Characters Code 란 특정 형태의 information을 다른 방법으로 표현하는 규칙 또는 해당 규칙으로 표현된 결과물 을 가르킴. 문자를 나타내기 위한 code는 인간이 사용하는 문자 를 일종의 기호 또

dsaint31.me

 


 

728x90