25. Python에서 파일에 데이터 쓰기, 읽기

안녕하세요. 언휴예요.

이전 강의에서 파일을 열 때 사용하는 open 내장 함수에 관해 다루었어요. 이번에는 파일에 데이터를 쓰고 읽는 방법에 대해 다룰게요.

파일에서 데이터를 읽을 때는 파일 개체의 멤버 메서드인 read, readline, readlines를 사용합니다. 그리고 데이터를 파일에 쓸 때는 write, writelines을 사용합니다.

  • read

파일 개체의 read 멤버 메서드는 파일의 전체 데이터를 읽어 반환합니다. 만약 입력 인자로 정수를 입력하면 입력한 개수의 문자를 읽어 반환합니다.

data = read([정수])

다음은 파일의 전체 내용을 읽어 콘솔 화면에 출력하는 예제 코드입니다.

#파일 내용을 읽어서 콘솔 화면에 출력하기

fname = input("파일명:")
try:
    fs = open(fname,"r")
    data = fs.read()
    print(data)
    fs.close()
except:
    print("존재하지 않는 파일입니다.")
[그림 1] 파일 내용 전체 읽기
[그림 1] 파일 내용 전체 읽기

다음은 파일에서 특정 개수의 문자만 읽어 콘솔 화면에 출력하는 예제 코드입니다.

#원하는 개수의 읽어서 콘솔 화면에 출력하기

fname = input("파일명:")
try:
    fs = open(fname,"r")
    n = int(input("읽어올 문자 수:"))
    data = fs.read(n)
    print(data)
    fs.close()
except:
    print("존재하지 않는 파일입니다.")
[그림 2] 원하는 개수의 문자 읽기
[그림 2] 원하는 개수의 문자 읽기
  • readline, readlines

Python의 파일 개체는 라인 단위로 데이터를 읽어오는 readline 메서드와 readlines 메서드를 제공합니다. 이름을 보면 알 수 있듯이 readline 메서드는 하나의 라인의 데이터를 읽어옵니다. readlines 메서드는 전체 데이터를 읽어오는데 라인 단위로 읽어온 데이터 컬렉션을 반환합니다.

다음은  readlines 메서드를 이용하여 라인 단위로 전체 내용을 읽어 라인 번호와 함께 콘솔 화면에 출력하는 예제 코드입니다.

#파일 내용 읽어서 라인 번호 함께 출력하기

fname = input("파일명:")
try:
    fs = open(fname,"r")
    data = fs.readlines()
    lc=0
    for ld in data:
        lc+=1
        print("<",lc,">",ld)
    fs.close()
except:
    print("존재하지 않는 파일입니다.")
[그림 3] 라인 번호 함께 출력하기
[그림 3] 라인 번호 함께 출력하기

다음은 readline 메서드를 이용하여 라인 단위로 전체 내용을 읽어 라인 번호와 함께 콘솔 화면에 출력하는 예제 코드입니다.

#파일 내용 읽어서 라인 번호 함께 출력하기

fname = input("파일명:")
try:
    fs = open(fname,"r")
    data = fs.readline()
    lc = 0
    while(data):
        lc+=1
        print("<",lc,">",data)
        data = fs.readline()        
    fs.close()
except:
    print("존재하지 않는 파일입니다.")
  • write/writelines

Python의 파일 개체에는 데이터를 파일에 쓸 때 write와 writelines 메서드를 제공합니다. 이 둘의 차이는 입력 인자의 형식입니다. write 메서드는 문자열을 입력 인자로 전달하며 writelines 메서드는 문자열 컬렉션을 전달합니다.

write와 writelines 메서드는 print함수와 다르게 자동으로 개행을 출력하지 않습니다. 다음은 writelines 메서드를 이용하여 회원 이름을 라인 별로 출력하는 예제 코드입니다. 회원 이름 목록에 있는 각 회원 이름에 개행을 포함하고 있는 상태입니다.

#회원 목록 출력하기 - writelines 이용

members=["홍길동\n","강감찬\n","을지문덕\n"]


fs = open("member.txt","w")
fs.writelines(members)
fs.close()

fs = open("member.txt")
data = fs.read()
print(data)
fs.close()
[그림 4] 회원 목록 출력하기 - writelines
[그림 4] 회원 목록 출력하기 – writelines

다음은 write 메서드를 이용한 예제입니다. 이번에는 회원 목록에 회원 이름을 보면 개행 문자가 없습니다. 대신 write 메서드에 회원 이름을 전달할 때 문자열의 join 메서드를 이용하고 있어요. 물론 회원 이름에 개행 문자를 포함하고 있다면 굳이 join 메서드를 이용할 필요가 없습니다. 하지만 회원 이름에 개행 문자가 있는 것 보다는 없는 것이 일반적이죠.

#회원 목록 출력하기 - write 이용

members=["홍길동","강감찬","을지문덕"]
delim = "\n"
str = delim.join(members)

fs = open("member.txt","w")
fs.write(str)
fs.close()

fs = open("member.txt")
data = fs.read()
print(data)
fs.close()
[그림 5] 회원 목록 출력하기 - write
[그림 5] 회원 목록 출력하기 – write