메서드 | 설명 |
read() | 파일에서 문자열을 읽음 |
write('문자열') | 파일에 문자열을 씀 |
readline() | 파일의 내용을 한 줄 읽음 |
readlines() | 파일의 내용을 한 줄씩 리스트 형태로 가져옴 |
writelines(문자열리스트) | 파일에 리스트의 문자열을 씀, 리스트의 각 문자열에는 \n을 붙여주어야 함 |
pickle.load(파일객체) | 파일에서 파이썬 객체를 읽음 |
pickle.dump(객체, 파일객체) | 파이썬 객체를 파일에 저장 |
1. 파일에 문자열 쓰기, 읽기
이제부터 파일에 문자열을 써서 파일을 만든 뒤에 만든 파일을 읽는 순서로 진행하겠습니다.
1) 파일에 문자열 쓰기
- 파일객체 = open(파일이름, 파일모드)
- 파일객체.write('문자열')
- 파일객체.close()
file_write_string.py
file = open('hello.txt', 'w') # hello.txt 파일을 쓰기 모드(w)로 열기. 파일 객체 반환
file.write('Hello, world!') # 파일에 문자열 저장
file.close() # 파일 객체 닫기
2) 파일에서 문자열 읽기
- 변수 = 파일객체.read()
file_read_string.py
file = open('hello.txt', 'r') # hello.txt 파일을 읽기 모드(r)로 열기. 파일 객체 반환
s = file.read() # 파일에서 문자열 읽기
print(s) # Hello, world!
file.close() # 파일 객체 닫기
3) 자동으로 파일 객체 닫기
with open(파일이름, 파일모드) as 파일객체:
코드
file_with_as_read_string.py
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
s = file.read() # 파일에서 문자열 읽기
print(s) # Hello, world!
2. 문자열 여러 줄을 파일에 쓰기, 읽기
1) 반복문으로 문자열 여러 줄을 파일에 쓰기
file_for_write_string.py
with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기
for i in range(3):
file.write('Hello, world! {0}\n'.format(i))
Hello, world! 0
Hello, world! 1
Hello, world! 2
2) 리스트에 들어있는 문자열을 파일에 쓰기
- 파일객체.writelines(문자열리스트)
file_writelines.py
lines = ['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
with open('hello.txt', 'w') as file: # hello.txt 파일을 쓰기 모드(w)로 열기
file.writelines(lines)
hello.txt
안녕하세요.
파이썬
코딩 도장입니다.
3) 파일의 내용을 한 줄씩 리스트로 가져오기
read는 파일의 내용을 읽어서 문자열로 가져오지만 readlines는 파일의 내용을 한 줄씩 리스트 형태로 가져옵니다..
- 변수 = 파일객체.readlines()
file_readlines.py
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
lines = file.readlines()
print(lines)
실행 결과
['안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n']
4) 파일의 내용을 한 줄씩 읽기
만약 파일의 내용을 한 줄씩 순차적으로 읽으려면 readline을 사용합니다.
- 변수 = 파일객체.readline()
file_readlines_while.py
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
line = None # 변수 line을 None으로 초기화
while line != '':
line = file.readline()
print(line.strip('\n')) # 파일에서 읽어온 문자열에서 \n 삭제하여 출력
실행 결과
안녕하세요.
파이썬
코딩 도장입니다.
5) for 반복문으로 파일의 내용을 줄 단위로 읽기
file_for.py
with open('hello.txt', 'r') as file: # hello.txt 파일을 읽기 모드(r)로 열기
for line in file: # for에 파일 객체를 지정하면 파일의 내용을 한 줄씩 읽어서 변수에 저장함
print(line.strip('\n')) # 파일에서 읽어온 문자열에서 \n 삭제하여 출력
실행 결과
안녕하세요.
파이썬
코딩 도장입니다.
파일 객체는 이터레이터입니다. 따라서 변수 여러 개에 저장하는 언패킹(unpacking)도 가능합니다
>>> file = open('hello.txt', 'r')
>>> a, b, c = file
>>> a, b, c
('안녕하세요.\n', '파이썬\n', '코딩 도장입니다.\n')
3. 파이썬 객체를 파일에 저장하기, 가져오기
파일에서 문자열만 읽고 쓴다면 조금 불편하겠죠?
파이썬은 객체를 파일에 저장하는 pickle 모듈을 제공합니다.
다음과 같이 파이썬 객체를 파일에 저장하는 과정을 피클링(pickling)이라고 하고, 파일에서 객체를 읽어오는 과정을 언피클링(unpickling)이라고 합니다.
![](https://blog.kakaocdn.net/dn/by3wrh/btsA3BDBjs1/jFk6kVliwIHtrK5hnYfROk/img.png)
1) 파이썬 객체를 파일에 저장하기 : 피클링
피클링은 pickle 모듈의 dump 메서드를 사용합니다.
pickle_dump.py
import pickle
name = 'james'
age = 17
address = '서울시 서초구 반포동'
scores = {'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}
with open('james.p', 'wb') as file: # james.p 파일을 바이너리 쓰기 모드(wb)로 열기
pickle.dump(name, file)
pickle.dump(age, file)
pickle.dump(address, file)
pickle.dump(scores, file)
27.3.2 파일에서 파이썬 객체 읽기
pickle_load.py
import pickle
with open('james.p', 'rb') as file: # james.p 파일을 바이너리 읽기 모드(rb)로 열기
name = pickle.load(file)
age = pickle.load(file)
address = pickle.load(file)
scores = pickle.load(file)
print(name)
print(age)
print(address)
print(scores)
실행 결과
james
17
서울시 서초구 반포동
{'korean': 90, 'english': 95, 'mathematics': 85, 'science': 82}
다른 파일 모드는 없나요?
파일 모드 | 기능 | 설명 |
'r' | 읽기 전용 | 파일을 읽기 전용으로 열기. 단, 파일이 반드시 있어야 하며 파일이 없으면 에러 발생 |
'w' | 쓰기 전용 | 쓰기 전용으로 새 파일을 생성. 만약 파일이 있으면 내용을 덮어씀 |
'a' | 추가 | 파일을 열어 파일 끝에 값을 이어 씀. 만약 파일이 없으면 파일을 생성 |
'x' | 배타적 생성(쓰기) | 파일을 쓰기 모드로 생성. 파일이 이미 있으면 에러 발생 |
'r+' | 읽기/쓰기 | 파일을 읽기/쓰기용으로 열기. 단, 파일이 반드시 있어야 하며 파일이 없으면 에러 발생 |
'w+' | 읽기/쓰기 | 파일을 읽기/쓰기용으로 열기. 파일이 없으면 파일을 생성하고, 파일이 있으면 내용을 덮어씀 |
'a+' | 추가(읽기/쓰기) | 파일을 열어 파일 끝에 값을 이어 씀. 만약 파일이 없으면 파일을 생성. 읽기는 파일의 모든 구간에서 가능하지만, 쓰기는 파일의 끝에서만 가능함 |
'x+' | 배타적 생성(읽기/쓰기) | 파일을 읽기/쓰기 모드로 생성. 파일이 이미 있으면 에러 발생 |
t | 텍스트 모드 | 파일을 읽거나 쓸 때 개행 문자 \n과 \r\n을 서로 변환 / t를 생략하면 텍스트 모드 |
b | 바이너리 모드 | 파일의 내용을 그대로 읽고, 값을 그대로 씀 |
읽기 'r', 쓰기 'w', 추가 'a', 배타적 생성 'x'
추가 모드: 이미 있는 파일에서 끝에 새로운 내용을 추가할 때 사용하고,
배타적 생성 모드 (exclusive creation) : 파일이 이미 있으면 에러(FileExistsError)를 발생시키고 없으면 파일을 만듭니다.
텍스트 모드 't', 바이너리 모드 'b'
'+' : 'r+t', 'w+t', 'r+', 'w+', 'r+b', 'w+b'
![](https://blog.kakaocdn.net/dn/HHZgR/btsA3AkVOWp/FZbARntV4M16qWUV6RFX71/img.png)
[ 연습문제 ]
'''
hello.txt
anonymously
compatibility
dashboard
experience
photography
spotlight
warehouse
'''
with open('hello.txt', 'r') as file:
count = 0
words = file.readlines()
for word in words:
if len(word.strip('\n')) <= 10:
count += 1
print(count) # 4
[ 연습문제 ]
"""
문자열이 저장된 words.txt 파일이 주어집니다(문자열은 한 줄로 저장되어 있습니다).
words.txt 파일에서 문자 c가 포함된 단어를 각 줄에 출력하는 프로그램을 만드세요.
단어를 출력할 때는 등장한 순서대로 출력해야 하며 ,(콤마)와 .(점)은 출력하지 않아야 합니다.
words.txt
Fortunately, however, for the reputation of Asteroid B-612, a Turkish dictator made a law that his subjects, under pain of death, should change to European costume. So in 1920 the astronomer gave his demonstration all over again, dressed with impressive style and elegance. And this time everybody accepted his report.
"""
with open("words.txt", "r") as file:
paragraph = file.readline().split()
L = []
for i in paragraph:
if "c" in i:
L.append(i.strip(".,"))
for j in L:
print(j)
결과 출력
dictator
subjects
change
costume
elegance
accepted
댓글