파이썬 실습창을 열 수 있습니다.실습창 열기
큰 고비를 넘어가고 있습니다.
힘을 냅시다.
1. 파일 입출력
파일의 데이터를 입력으로 사용하고, 출력도 파일에 하여 봅시다.
1-1. 입력 파일 만들기
메모장(또는 다른 편집기)에 다음과 같이 data를 입력하고, 파일 이름은 ‘input,txt’로 하여 저장하세요.
경로(path)는 기억하기 쉬운 곳으로 하며, 메모장에서 저장할 때는 (.txt)를 붙이지 않습니다.
확장자 txt는 자동으로 부여됩니다.
1-2. 파일 읽기와 쓰기
다음과 같이 코딩하고 실습하세요.
fin=open('d:/input.txt')
fout=open('d:/output.txt','w')
a=fin.readline() #한줄 읽기
print(a) #화면 출력
fout.write(a) #파일 출력
fin.close() #close()는 반드시 있어야 합니다.(저장정보 보호)
fout.close() #close()는 반드시 있어야 합니다.(저장정보 보호)
'''
fin, fout은 다른 이름으로 바꿀 수 있습니다.
경로는 자신의 퍄일 경로를 사용하세요.
3, 5, 6, 7번 줄의 fin과 fout는 1번, 2번 줄의 이름과 같아야 합니다.
2번 줄의 끝에 있는 'w'는 반드시 있어야 합니다. (출력 파일, write의 의미)
'''
- 2번 라인의 output.txt에 의하여 output,txt 파일은 자동으로 만들어 집니다.
- ouput.txt 파일을 열어서 ‘1 2 3’과 같이 저장된 것을 확인하세요.
- fin, fout 등은 임의로 만든 변수 이름이므로 바꿀 수 있습니다.
- 오픈(open)은 지정한 파일과 사용자 코드를 전기적으로 접속하는 것입니다. 휴대폰을 처음 사면 기지국과 개통해야 사용할 수 있는 것과 비슷합니다.
- fin,readline()은 한 줄 전체를 str형으로 읽어서 왼쪽 변수에 binding합니다. 읽는 위치(줄, off-set)는 시스템이 계산하여 처음부터 순서대로 한 줄씩 읽습니다.
- open된 파일의 사용이 종료되었으면 close(종료)하여야 입력 파일을 보호할 수 있습니다. close는 전기적 접속만 차단합니다.
- 5번 라인의 fout.write(인수)에서 인수는 한 개의 str만 적어야 합니다. (숫자 등은 문자로 변환)
- 전체 파일을 읽으려면 3번 줄의 readline()을 readlines()로 바꾸면 됩니다. (끝에 s가 있습니다)
● with의 사용
조금 간단한 입출력 방법도 있습니다.
with를 사용하면 close()를 쓰지 않아도 됩니다.
다음 코드는 위와 같습니다.
with open('d:/input.txt') as fin:
a=fin.readline()
print(a)
with open('d:/output.txt','w') as fout:
fout.write(a)
'''
close()가 없어도 됩니다.
'''
※ 파이썬 실습창
파이썬 실습창(trinket)에서는 경로를 지정할 수 없습니다.
다음과 같이 실습히세요.
업로드 버튼(빨강 화살표)으로 input.txt 파일을 업로드합니다.
업로드하면 위와 같이 input.txt 파일이 나타납니다.
실습창의 코드는 다음과 같습니다.
with open('input.txt') as fin:
a=fin.readline()
print(a)
with open('output.txt','w') as fout:
fout.write(a)
'''
경로를 사용하지 않습니다.
출력도 실습창 탭에 표시됩니다.
'''
※ 파일의 구문과 메소드를 정리하였습니다.
no | item | example | description | |
1 | open | f=open(name[,mode [,buffersize[,encoding[,errors[,newline [,closefd]]]]]]) |
∙name에는 경로를 포함할 수 있다. ∙mode는 r(읽기),w(쓰기),a(추가)가 있다 'rt', 'wt', 'at'에서 t를 생략한 것이다. ∙binary는‘rb','wb'처럼 b를 추가한다. ∙‘r+', 'w+' 등은 같은 파일에 읽기쓰기 ∙buffersize는 buffer 방식을 지정. ∙encoding은 ‘utf-8','ascii' 등 ∙errors는 encoding error 처리 방식 ∙newline은 줄바꿈 모드 작동 방식 None, ‘’,‘\n', '\r','\r\n'등을 사용 ∙closefd는 close() 호출 때의 처리 ⦁한글 인코딩 방식 (아래의 표 참조) |
|
read | fin=open('input.txt') fin=open('input.txt','r') #위와 같음 |
|||
write | fout=open('output.txt','w') #쓰기용 | |||
2 | read | byte | f.read([n]) # 최대 n byte를 읽는다. | 최대 n 바이트까지 읽음 |
한 줄 읽기 |
f.readline([n]) #한 줄씩 읽음 | n을 생략하면 줄 전체를 읽는다. n은 한 줄에서 읽는 최대 문자수이다. |
||
전체 읽기 |
f.readlines([size]) #전체 읽음. s 주의! ------------------------------------------- # input.txt 전체를 읽어 오는 예이다. fin=open('e:/prob/test/input.txt') r=fin.readlines() print(r) fin.close() 실행 결과는 list |
∙모든 줄을 읽어서 list로 반환한다. ∙size는 읽을 대략적인 문자의 개수이다. 생략하면 전체를 읽는다. ∙읽는 위치(file pointer:offset)는 자동 관리된다. ∙offset은 파일 자체와 연결되는 것이 아니라 open으로 반환되는 파일 객체와 연결된다. 그러므로 같은 프로그램에서 중복하여 open할 수 있으며 offset은 별도로 관리된다. ∙f.tell():현재의 파일 포인터를 반환한다. ∙f.seek(offset, [whence]) 새로운 파일 위치를 찾는다. whence가 0이면 시작 위치 기준(기본값), 1이면 현재 위치 기준, 2이면 끝 위치를 기준으로 한다. [참고] 파일을 한 줄씩 모두 읽는 방법이다. while True: line=f.readline() if not line: #파일의 끝 break |
||
3 | write | 전체 쓰기 |
f,writelines(lines) #순서열인 lines 전체를 출력한다. -------------------------------------------- fin=open('e:/prob/input.txt') fout=open('e:/prob/output.txt','w') r=fin.readlines() fout.writelines(r) #전체 출력 fin.close() fout.close() |
str list를 출력한다. 즉, 모든 원소가 str type인 sequence 전체를 출력한다. 쓰는 위치(file pointer:offset)는 자동관리된다. |
4 | with | 자동 닫기 |
with open('e:/prob/output.txt','w') as fout: fout.write('with test') |
∙with는 파일을 자동으로 열고닫는다. ∙시스템과 연결 및 해제에도 쓰인다. |
※ 한글 인코딩
인코딩(encoding)은 우리가 사용하는 텍스트를 기계가 이해하는 언어로 표현하는 방법입니다.
예를 들어, 대문자 A는 65, 소문자 a는 97 등입니다.
한글 인코딩은 몇 가지가 있는데 많이 사용되는 것이 CP949(확장 완성형)와 UTF-8(유니코드)입니다.
인코딩 | 방식 | 특징 |
euc-kr | 완성형 | 2350글자에 번호 할당 |
cp949 | 완성형 | 11720 글자에 번호 |
utf-8 | 조합형 | 자음, 모음에 번호 할당 |
운영체제별(window, mac, linux 등)로 사용하는 인코딩 방식이 다릅니다.
- 윈도는 CP949
- 맥과 리눅스는 UTF-8
각 운영체제로 만든 파일에 대한 처리는 가능하지만, 깨짐이 발생 할 수 있습니다.
에러 메시지가 발생하면 다른 방식으로 인코딩하여 보세요.
아래의 예는 cp949 에러가 발생하여 UTF8 방식으로 인코딩을 한것입니다.
fin=open('input.txt',encoding='UTF8')
fout=open('output.txt.','w')
a=fin.readlines()
print(a)
fin.close()
fout.close()
'''
1번 줄의 끝에 encoding='UTF8'을 추가합니다.
'''
수고가 많았습니다.
오늘 끝.
'알고리듬' 카테고리의 다른 글
[알고리듬] #41 브야사의 한 삶 (2) | 2024.04.07 |
---|---|
[알고리듬 ] #40 파일 처리 (1) | 2024.04.07 |
[알고리듬] #38 불 표현식 (0) | 2024.04.05 |
[알고리듬] #37 우선순위와 변수활용 (0) | 2024.04.05 |
[알고리듬] #35 내장함수 (0) | 2024.04.05 |