Python 과 파일 대상 이 함께 일 하 는 인 스 턴 스 를 자세히 설명 합 니 다.

Python 과 파일 대상 이 함께 일 하 는 인 스 턴 스 를 자세히 설명 합 니 다.
Python 에는 디스크 에 있 는 파일 을 열 수 있 는 내장 함수 가 있 습 니 다.open 은 파일 대상 을 되 돌려 줍 니 다.열 린 파일 에 대한 정 보 를 얻 고 열 린 파일 을 조작 할 수 있 는 방법 과 속성 을 가지 고 있 습 니 다.

>>> f = open("/music/_singles/kairo.mp3", "rb") (1) 
>>> f                      (2) 
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> 
>>> f.mode                   (3) 
'rb' 
>>> f.name                   (4) 
'/music/_singles/kairo.mp3' 
(1)  open 방법 은 세 개의 인 자 를 받 을 수 있 습 니 다.파일 이름,모드,버퍼 파라미터 입 니 다.첫 번 째 인자(파일 이름)만 필요 합 니 다.나머지 두 개 는 선택 할 수 있 습 니 다.지정 되 지 않 으 면 파일 을 텍스트 로 엽 니 다.여기 서 우 리 는 바 이 너 리 방식 으로 파일 을 열 어 읽 습 니 다.(print open.__doc__ 가능 한 모든 패턴 에 대한 좋 은 설명 을 해 드 리 겠 습 니 다.)
(2)  open 함수 가 대상 을 되 돌려 줍 니 다.파일 대상 에 몇 가지 유용 한 속성 이 있 습 니 다.
(3)  파일 대상 의 mode 속성 은 파일 이 어떤 모드 로 열 리 는 지 알려 줍 니 다.
(4)  파일 대상 의 name 속성 은 파일 대상 이 열 린 파일 이름 을 알려 줍 니 다.
1.파일 읽 기
파일 을 열 면 다음 예 에서 보 여 준 것 처럼 첫 번 째 로 읽 어야 합 니 다.

>>> f 
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> 
>>> f.tell()       (1) 
0 
>>> f.seek(-128, 2)    (2) 
>>> f.tell()       (3) 
7542909 
>>> tagData = f.read(128) (4) 
- 99 -Dive Into Python http://diveintopython.org/ 
>>> tagData 
'TAGKAIRO****THE BEST GOA     ***DJ MARY-JANE***       
Rave Mix           2000http://mp3.com/DJMARYJANE   \037' 
>>> f.tell()       (5) 
7543037 

(1)  파일 대상 이 열 린 파일 의 상 태 를 유지 합 니 다.파일 대상 의 tell 방법 은 열 린 파일 의 현재 위 치 를 알려 줍 니 다.우 리 는 아직 이 파일 에 대해 아무것도 하지 않 았 기 때문에 현재 위 치 는 0 이 고 파일 의 시작 부분 입 니 다.
(2)  파일 대상 의 seek 방법 은 열 린 파일 에서 다른 위치 로 이동 합 니 다.두 번 째 매개 변 수 는 첫 번 째 매개 변 수 는 무슨 뜻 인지 지적 합 니 다.0 은 절대적 인 위치 로 이동 하 는 것 을 의미 합 니 다(파일 시작 부분 에서 계산).1 은 상대 적 인 위치 로 이동 하 는 것 을 의미 합 니 다(현재 위치 에서 계산).그리고 2 는 파일 끝 에 있 는 위 치 를 표시 합 니 다.검색 한 MP3 표 시 는 파일 의 끝 에 저장 되 어 있 기 때문에 2 를 사용 하여 파일 대상 에 게 파일 끝 에서 128 바이트 로 이동 하 는 위 치 를 알려 줍 니 다.
(3)  tell 방법 은 현재 위치 가 이동 한 것 을 확 인 했 습 니 다.
(4)  read 방법 은 열 린 파일 에서 지정 한 바이트 를 읽 고 데 이 터 를 읽 는 문자열 을 되 돌려 줍 니 다.선택 가능 한 매개 변 수 는 읽 을 최대 바이트 수 를 지정 합 니 다.지정 한 인자 가 없 으 면 read 는 파일 끝까지 읽 습 니 다.(우 리 는 여기에서 read()를 간단하게 말 할 수 있 었 다.왜냐하면 우 리 는 파일 의 어디 에 있 는 지 정확히 알 고 있 었 기 때문이다.사실은 우리 가 읽 은 것 은 마지막 128 개의 바이트 이다.)읽 은 데 이 터 는 변수 tagData 에 부여 되 고 현재 위 치 는 읽 은 바이트 수 에 따라 수정 되 었 습 니 다.
(5)  tell 방법 은 현재 위치 가 이동 한 것 을 확 인 했 습 니 다.산 수 를 해 보면 128 개의 바이트 를 읽 은 후에 위치 수가 128 증가 한 것 을 볼 수 있 을 것 이다.
2.파일 닫 기
파일 을 열 면 시스템 자원 이 소모 되 고 그 동안 다른 프로그램 이 접근 할 수 없 을 수도 있 습 니 다(파일 모드 에 따라 결 정 됩 니 다).이것 이 작업 이 끝나 면 파일 을 닫 아야 하 는 중요 한 부분 이다.

>>> f 
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> 
>>> f.closed    (1) 
False 
>>> f.close()   (2) 
>>> f 
<closed file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> 
>>> f.closed    (3) 
True 
>>> f.seek(0)   (4) 
Traceback (innermost last): 
- 100 -Dive Into Python http://diveintopython.org/ 
 File "<interactive input>", line 1, in ? 
ValueError: I/O operation on closed file 
>>> f.tell() 
Traceback (innermost last): 
 File "<interactive input>", line 1, in ? 
ValueError: I/O operation on closed file 
>>> f.read() 
Traceback (innermost last): 
 File "<interactive input>", line 1, in ? 
ValueError: I/O operation on closed file 
>>> f.close()   (5) 
(1)  파일 대상 의 closed 속성 은 대상 이 열 렸 는 지 닫 혔 는 지 를 표시 합 니 다.이 예 에서 파일 은 여전히 열 려 있 습 니 다(closed 는 False).
(2)  파일 을 닫 기 위해 파일 대상 의 close 방법 을 호출 합 니 다.이렇게 하면 파일 에 추 가 된 자 물 쇠 를 풀 고 버퍼 링 된 시스템 에 기록 되 지 않 은 출력(있 으 면)을 새로 고치 고 시스템 자원 을 방출 합 니 다.
(3)  closed 속성 은 파일 이 닫 혔 음 을 증명 합 니 다.
(4)  파일 이 닫 혔 지만 파일 대상 이 더 이상 존재 하지 않 는 다 는 것 은 아 닙 니 다.변수 f 는 역할 영역 을 초과 하거나 수 동 으로 삭 제 될 때 까지 계속 존재 합 니 다.그러나 파일 이 닫 히 면 그것 을 조작 하 는 방법 은 하나 도 사용 할 수 없다.그것들 은 모두 이상 을 일 으 킬 수 있다.
(5)  파일 이 닫 힌 파일 대상 에 게 close 를 호출 하 는 것 은 이상 하지 않 습 니 다.조용히 실 패 했 습 니 다.
3.처리  I/O 오류
이제 이전 장의 예 프로그램 인 fileinfo.py 의 파일 처리 코드 를 충분히 이해 할 수 있 습 니 다.다음 예 는 파일 을 안전하게 열 고 읽 는 방법 과 오 류 를 아름 답 게 처리 하 는 방법 을 보 여 줍 니 다.

try:                (1) 
      fsock = open(filename, "rb", 0) (2) 
      try:               
        fsock.seek(-128, 2)     (3) 
        tagdata = fsock.read(128)  (4) 
      finally:            (5) 
        fsock.close()        
      . 
      . 
      . 
    except IOError:           (6) 
      pass        
(1)  파일 을 열 고 읽 는 것 은 위험 하고 이상 을 일 으 킬 수 있 기 때문에 모든 코드 는 try...except 블록 으로 봉 합 니 다.(어이,표준화 가 가 까 워 지면 안 돼?이것 이 바로 네가 그것 을 감상 하기 시작 한 곳 이다.)
(2)  open 함수 가 IOError 이상 을 일 으 킬 수 있 습 니 다.(파일 이 존재 하지 않 을 수도 있 습 니 다.)
(3)  seek 방법 은 IOError 이상 을 일 으 킬 수 있 습 니 다.(파일 길이 가 128 바이트 보다 작 을 수 있 습 니 다.)
(4)  read 방법 은 IOError 이상 을 일 으 킬 수 있 습 니 다.(디스크 에 고장 난 섹 터 가 있 거나 네트워크 드라이브 에 있 을 수도 있 습 니 다.네트워크 가 마침 끊 겼 습 니 다.)
(5)  이것 은 새로운 것 입 니 다:try...finally 블록 입 니 다.파일 이 open 함 수 를 통 해 성공 적 으로 열 리 면 seek 나 read 방법 에 이상 이 생 겼 을 때 도 닫 아야 합 니 다.try...finally 블록 은 finally 블록 에 있 는 코드 를 사용 할 수 있 습 니 다.
항상 실 행 됩 니 다.심지어 어떤 것 이 try 블록 에서 이상 을 일 으 켜 도 실 행 됩 니 다.길에서 무슨 일이 있어 도 코드 는 곧 멸망 할 것 이다.
(6)  마지막 으로 우리 의 IOError 이상 을 처리 합 니 다.오픈,seek,read 호출 으로 인 한 IOError 이상 일 수 있 습 니 다.여기 서 우 리 는 사실 관심 을 가 질 필요 가 없다.왜냐하면 해 야 할 일 은 조용히 그것 을 무시 하고 계속 하 는 것 이기 때문이다.패스 는 아무것도 하지 않 는 파 이 썬 문구 라 는 것 을 기억 하 세 요.)이렇게 하면 완전히 합 법 적 이 고'처리'의 이상 은 어떤 일 도 하지 않 는 다 는 것 을 명확 하 게 나 타 낼 수 있다.그것 은 여전히 처리 되 었 다 고 여 겨 지고 처 리 는 정상적으로 계 속 될 것 입 니 다.try..except 블록 의 다음 줄 코드 부터 시작 합 니 다.
4.파일 쓰기
기대 하 는 바 와 같이 파일 을 읽 는 것 과 같은 방식 으로 파일 을 쓸 수 있 습 니 다.두 가지 기본 파일 모드 가 있 습 니 다.
•추가(Append)모드 에서 데 이 터 를 파일 끝까지 추가 합 니 다.
•쓰기(write)모드 는 파일 의 원래 내용 을 덮어 씁 니 다.
파일 이 존재 하지 않 으 면 모든 모드 에서 자동 으로 파일 을 만 들 기 때문에 복잡 한 논리 가 필요 하지 않 습 니 다."log 파일 이 존재 하지 않 으 면 새로운 빈 파일 을 만 들 것 입 니 다.그 렇 기 때문에 처음으로 열 수 있 습 니 다."파일 을 열 고 쓰기 시작 하면 됩 니 다.

>>> logfile = open('test.log', 'w') (1) 
>>> logfile.write('test succeeded') (2) 
>>> logfile.close() 
>>> print file('test.log').read()  (3) 
test succeeded 
>>> logfile = open('test.log', 'a') (4) 
- 102 -Dive Into Python http://diveintopython.org/ 
>>> logfile.write('line 2') 
>>> logfile.close() 
>>> print file('test.log').read()  (5) 
test succeededline 2 
(1)  새 파일 test.log 를 만 들 거나 기 존 파일 을 덮어 쓰 고 항목 을 쓰기 위해 열 수 있 습 니 다.(두 번 째 인자'w'는 파일 을 쓰기 위해 열 린 다 는 뜻 입 니 다.)네,생각 했 던 것 만큼 위험 해 요.나 는 네가 문서 이전의 내용 에 관심 을 가지 지 않 기 를 바란다.왜냐하면 그것 은 지금 이미 존재 하지 않 기 때문이다.
(2)  open 에서 돌아 온 파일 대상 의 write 방법 으로 새로 열 린 파일 에 데 이 터 를 추가 할 수 있 습 니 다.
(3)  file 은 open 의 동의어 입 니 다.이 줄 문 구 는 파일 을 열 고 내용 을 읽 고 인쇄 합 니 다.
(4)  공교롭게도 test.log 가 존재 한 다 는 것 을 알 고 있 었 습 니 다(방금 데 이 터 를 다 썼 기 때문에).그래서 열 어서 데 이 터 를 추가 할 수 있 습 니 다.("a"매개 변 수 는 추가 목적 으로 파일 을 여 는 것 을 의미 합 니 다.)실제로 파일 이 존재 하지 않 더 라 도 이렇게 할 수 있 습 니 다.추가 로 파일 을 열 때 필요 하 다 면 파일 을 만 들 수 있 기 때 문 입 니 다.그러나 추가 작업 은 파일 의 기 존 내용 을 손상 시 키 지 않 습 니 다.
(5)  보시 다시 피 원래 줄 과 당신 이 추가 로 쓴 두 번 째 줄 은 현재 test.log 에 있 습 니 다.동시에 두 줄 사이 에 리 턴 문자 가 포함 되 어 있 지 않 음 을 주의 하 세 요.두 번 이나 파일 을 쓸 때 리 턴 부 호 를 명확 하 게 쓰 지 않 았 기 때문에 파일 에는 리 턴 부호 가 포함 되 어 있 지 않 습 니 다.너 는""로 리 턴 부 호 를 쓸 수 있다.이 일 을 하지 않 았 기 때문에 파일 에 쓴 모든 내용 이 같은 줄 에 표 시 됩 니 다.
궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기