[파이썬] 파일 처리
by mini_min[파이썬] 파일 처리
🖋️ 파일 처리
: 텍스트 파일 저장을 위해 pathname 이 필요하다.
open() 의 경우 파일을 쓰기 용도로 open 한다. 파일이 없으면 만들고, 있으면 지우고 다시 만든다.
mode = "w" 는 쓰기 모드, mpde = "r" 는 읽기 모드이다. 인코딩도 같이 해준다.
# 텍스트 파일 저장
pathname = 'C:/source/data/test.txt'
# 파일을 쓰기 용도로 open
# 파일이 없으면 만들고, 있으면 지우고 다시 만든다.
f = open(pathname, mode="w", encoding="utf-8")
for i in range(1, 21):
data = "%d 라인 내용입니다... \n" % i
f.write(data) #파일에 저장
f.close() # 파일은 사용 후 반드시 close() 해야한다.
print("파일 저장 완료")
: 파일은 사용 후 반드시 close() 해줘야한다.
# 텍스트 파일 저장
pathname = 'C:/source/data/test.txt'
try:
# 파일을 쓰기 용도로 open
f = open(pathname, mode="w", encoding="utf-8")
for i in range(1, 26):
data = "%d 라인 내용입니다... \n" % i
f.write(data) #파일에 저장
finally:
f.close() # 파일은 사용 후 반드시 close() 해야한다.
print("파일 저장 완료")
: open 이 아니라 with 구문으로 파일 처리하면, 파일은 자동으로 close() 해준다.
# 텍스트 파일 저장
pathname = 'C:/source/data/test.txt'
# with 구문을 벗어나면 파일은 자동으로 close() 됨
with open(pathname, mode="w", encoding="utf-8") as f :
for i in range(1, 21):
data = "%d 라인 내용입니다... \n" % i
f.write(data) #파일에 저장
print("파일 저장 완료")
: 텍스트 파일 저장에서 엔터를 누르면 저장완료 메시지가 출력되고 종료된다.
# 텍스트 파일 저장 : 키보드로 입력한 문자열을 test2.txt로 저장하는 프로그램
# 아무것도 입력하지 않고 엔터를 누르면 "저장완료..."메시지 출력후 종료
pathname = 'C:/source/data/test2.txt'
with open(pathname, mode="w", encoding="utf-8") as f :
while True:
data = input("문자열[빈문자열 엔터:종료]?")
if not data:break
f.write(data+"\n")
print("파일 저장 완료")
🖋️ 파일 읽기
: 읽을 파일이 없으면 예외가 발생한다.
readline() 은 파일의 한 줄을 읽어서 문자열로 반환한다.
# 텍스트 파일 열기
# 파일이 없으면 FileNotFoundError 예외 발생!
# readline() : 파일의 한 줄을 읽어서 문자열로 반환
pathname = 'C:/source/data/test.txt'
with open(pathname, mode="r", encoding="utf-8") as f :
while True:
data = f.readline() # 각줄의 마지막에 \n이 포함되어있음
if not data:break
print(data, end='')
print()
: readlines() 는 파일의 모든 줄을 읽어서 list 로 반환한다.
print(lines) 하게 되는 경우 각 줄 마지막에 \n이 있다.
# 텍스트 파일 열기
# 파일이 없으면 FileNotFoundError 예외 발생!
# readlines() : 파일의 모든 줄을 읽어서 list로 반환
pathname = 'C:/source/data/test.txt'
with open(pathname, mode="r", encoding="utf-8") as f :
lines = f.readlines()
#print(lines) # 각줄 마지막에 \n이 있음
for line in lines:
print(line, end='')
: read(size) 는 읽을 문자의 수이다. 생략시 파일의 모든 내용을 읽어 문자열로 반환한다.
# 텍스트 파일 열기
# 파일이 없으면 FileNotFoundError 예외 발생!
# read(size) : size를 생략하면 파일의 내용 전체를 읽어 문자열로 반환
# size : 읽을 문자 수
pathname = 'C:/source/data/test.txt'
with open(pathname, mode="r", encoding="utf-8") as f :
data = f.read()
print(data)
: 파일 객체를 for 문과 함께 사용하면 파일을 줄 단위로 읽는다.
# 텍스트 파일 열기
# 파일이 없으면 FileNotFoundError 예외 발생!
# 파일 객체를 for문과 함께 사용하면 파일을 줄단위로 읽는다.
pathname = 'C:/source/data/test.txt'
with open(pathname, mode="r", encoding="utf-8") as f :
for s in f: # 마지막에 \n이 포함되어 있음
print(s, end='')
: 텍스트 파일 추가 : 없으면 만들고, 있으면 추가한다.
# 텍스트 파일 추가 : 없으면 만들고, 있으면 추가
pathname = 'C:/source/data/test.txt'
# with 구문을 벗어나면 파일은 자동으로 close() 됨
with open(pathname, mode="a", encoding="utf-8") as f :
for i in range(26, 51):
data = "%d 라인 내용입니다... \n" % i
f.write(data)
print("파일 저장 완료")
: 파일을 읽어 과목 평균과 점수로 pass 파일 만들기
for 문으로 읽어서 line 을 나누고, 나눈 라인의 값을 int 로 변환해서 계산 작업한다.
#score.txt 파일을 읽어 모든 과목이 40점 이상 평균 60점 이상인 사람만
# pass.txt 에 저장하기
# 학번, 이름, 국, 영, 수, 총점, 평균 형식으로 저장
# 1001,홍길동,80,80,80,
pathname1 = 'C:/source/data/score.txt'
pathname2 = 'C:/source/data/pass.txt'
try:
f1 = open(pathname1, mode="r", encoding="utf-8")
f2 = open(pathname2, mode="w", encoding="utf-8")
for line in f1:
line = line.replace("\n", "")
datas = line.split(",")
ss = [int(datas[i]) for i in range(2,5)]
tot = sum(ss)
ave = tot // 3
result = ",".join(s for s in datas)
result += "," + str(tot) + "," + str(ave)
if ss[0] >= 40 and ss[1]>=40 and ss[2]>=40 and ave>=60:
f2.write(result+"\n")
finally:
f1.close()
f2.close()
print("생성완료")
🖋️ 작업 경로, 폴더 만들기, 제거하기
import os
# 현재 작업 경로 확인
s = os.getcwd()
print("작업경로: ", s)
#경로 변경
os.chdir(r"C:\source\data")
s = os.getcwd()
print("작업경로: ", s)
#폴더만들기
#os.mkdir("C:/source/data/ex")
#폴더 제거
os.rmdir("C:/source/data/ex")
os.system("dir")
: 확장자로 파일 가져오기, 전체 파일 목록 가져오기 등
import os
import glob
# 전체 파일 목록(폴더, 파일명만(경로 미포함) 가져옴)
path = "./data"
file_list = os.listdir(path)
print(file_list)
# 확장자가 txt인 파일 가져오기
file_list_txt = [file for file in file_list if file.endswith(".txt")]
print(file_list_txt)
path = "C:\source\ch01\*"
#path = "./ch01/*"
file_list = glob.glob(path)
print(file_list)
: 파일 복사, 파일 이동, 파일 삭제
import os
import shutil
# 파일 복사
shutil.copy("C:/source/data/score.csv", "C:/source/data/s.csv")
# 파일 이동
shutil.move("C:/source/data/s.csv", "C:/source/s.csv")
# 파일 삭제
path = "C:/source/s.csv"
if os.path.exists(path):
os.remove(path)
print("파일 삭제 완료")
else:
print("not exist")
# 파일 삭제2
os.unlink("C:/source/data/test.txt")
: csv 파일을 읽어올 수 있다. reader() 를 사용하면
import csv
pathname = "C:/source/data/score.csv"
f = open(pathname, "r", encoding="utf-8")
rd = csv.reader(f)
for rec in rd:
print(rec) # 타입 : <class 'list'>
f.close()
: csv 형 리스트 만들기는 reader 로 읽어서 for 문으로 리스트에 append 해준다.
import csv
# csv 형 리스트 만들기 : [[1행], [2행]...]
pathname = "C:/source/data/score.csv"
output = []
with open(pathname, "r", encoding="utf-8") as f:
rd = csv.reader(f)
for rec in rd:
output.append(rec)
print(output)
: csv 파일 작성은 writer 를 사용한다.
import csv
pathname = "C:/source/data/score.csv"
a = [['학번','이름','국어','영어','수학'],
['1001','김자바',80,90,80],
['1002','오자바',70,60,50],
['1003','이자바',60,80,75]
]
with open(pathname, "w", newline='', encoding="utf-8") as f:
obj = csv.writer(f, delimiter=",") # 구분자 ,는 생략 가능
obj.writerows(a)
print('csv 파일 생성 완료 ')
: usecsv.py 만들기
import csv
# csv 파일 열기
def readcsv(pathname):
output = []
try:
f = open(pathname, mode="r", encoding="utf-8")
rd = csv.reader(f)
for rec in rd:
output.append(rec)
except FileNotFoundError:
raise FileNotFoundError("[" + pathname + "] 파일이 존재하지 않습니다.")
except Exception as err:
raise Exception(err)
finally:
try:
f.close()
except:
pass
return output
# csv 파일 저장하기
def writecsv(pathname, the_list):
with open(pathname, mode="w", newline="", encoding="utf-8") as f:
obj = csv.writer(f, delimiter=",")
obj.writerows(the_list)
import usecsv
try:
pathname= "C:/source/data/score.csv"
score_list = usecsv.readcsv(pathname)
print(score_list)
except Exception as err:
print(err)
'Python' 카테고리의 다른 글
[파이썬] JSON (0) | 2022.12.25 |
---|---|
[파이썬] 정규식 (0) | 2022.12.25 |
[파이썬] 예외 (0) | 2022.12.25 |
[파이썬] 모듈 (0) | 2022.12.25 |
[파이썬] 클래스 다중상속, 추상 메서드 (1) | 2022.12.25 |
블로그의 정보
개발자 미니민의 개발로그
mini_min