>  기사  >  백엔드 개발  >  Python의 파일 처리에 대한 자세한 소개

Python의 파일 처리에 대한 자세한 소개

高洛峰
高洛峰원래의
2017-03-22 10:38:211463검색

파이썬에서 하드디스크의 파일을 조작하려면 대략 3단계로 나눌 수 있습니다.

open 함수를 사용하여 파일 핸들을 열고 할당합니다. 변수에.

해당 파일 핸들을 통해 지정된 파일을 동작시킵니다.

작업이 완료된 후 파일을 닫습니다. 파일을 닫은 후 파일 내용이 디스크에 기록됩니다.

오픈 기능을 사용하는 방법은 다음과 같습니다.

open('파일 경로',mode='파일 열기 모드',encoding='파일 인코딩 방법')

파일 경로: 이 파일 경로는 절대 경로 또는 상대 경로일 수 있습니다. , 파이썬에서는 상대경로에 파일명만 적으면 되고, 파이썬 프로그램과 열려고 하는 파일이 같은 디렉터리에 있으면 상대경로를 직접 쓰면 됩니다.

주의하세요! open 기능을 사용하시려면 파일 경로는 필수 파라미터이므로 생략할 수 없습니다!

파일 열기 모드: open 함수에는 선택적 형식 매개변수가 있는데, 이는 파일 열기 모드를 정의하는 데 사용됩니다. 파일 열기 모드가 지정되지 않은 경우 r(읽기) -only)는 기본적으로 파일을 여는 데 사용됩니다.

파이썬에서 제공하는 일반적인 파일 열기 방법은 다음과 같습니다.

'r'은 파일을 읽기 전용 모드로 엽니다. 파일을 열려면 r(읽기 전용 모드)을 사용합니다. 파일은 읽기만 가능하고 쓰기 작업은 수정할 수 없습니다. (파일이 없으면 예외가 발생합니다.)

'w'는 파일을 쓰기 전용 모드로 엽니다. 파일을 열려면 w(쓰기 전용 모드)만 가능합니다. 쓴 것이 아니라 읽는 것이 아니라 특별히 주의해야 할 점이 하나 있습니다. ! ! ! ! 원본 내용이 포함된 파일을 w를 사용하여 열면 파일 내용이 지워집니다! ! (이유에 대해서는 이 글 후반부에 추가하겠습니다.) (파일의 원본 내용이 지워지는 것을 원하지 않는다면!! 그렇다면 절대 w 모드를 사용하지 마세요!!!!!!) (파일이 존재하지 않으면 파일이 생성됩니다. 파일이 존재하면 파일 내용이 먼저 지워집니다.)

'a' 추가 모드도 쓰기 전용 모드이며 끝에 내용을 추가하는 데 사용됩니다. 매도호가, 작성된 내용은 파일 끝에 추가됩니다

'b' 바이너리 모드, 바이너리 모드를 사용하여 파일을 열려면 주의하세요! 이 'b'(바이너리 모드)는 세 가지 모드(r, w, a)와 함께 사용됩니다. (이 모드는 크로스 플랫폼 및 크로스 운영 체제에 권장됩니다)

'r+' 읽기 및 쓰기 가능 (이 모드에서는 읽기 및 쓰기가 가능하지만 쓰기 시 주의해야 합니다. 탐색 포인터는 still in the file 탐색 포인터의 위치를 ​​조정하지 않고 직접 쓰기를 시작하면 이전에 쓴 내용을 바로 덮어쓰기(파일의 선두부터 시작)하게 되므로 r+ 모드를 사용할 때는 주의해야 합니다. 파일 내 위치! 그렇지 않으면 원본 내용을 덮어쓰게 됩니다. )

'w+'는 일반적으로 사용되지 않으며 파일이 지워집니다. 직접)

끝에 'a+' 추가, 쓰기 및 읽기 가능

1. 파일 객체를 조작하는 일반적인 방법

파일 읽기:

읽기 가능( )은 파일을 읽을 수 있는지 여부를 결정하는 데 사용되며, 읽을 수 있으면 True를 반환하고, 그렇지 않으면 False를 반환합니다.

readline()은 파일을 한 번에 한 줄씩 읽고 문자열 유형을 반환합니다.

read()는 파일의 모든 내용을 한 번에 읽고 전체 문자열을 반환합니다.

readlines()는 파일의 모든 내용을 읽고 파일의 각 줄을 목록에 추가합니다.

파일 쓰기:

writable(): 파일이 쓰기 가능한지 확인하고, 그렇지 않으면 False를 반환합니다.

write(): 파일에 내용을 씁니다. 이 방법은 파일이 쓰기 가능 모드인 경우에만 사용할 수 있습니다. 쓸 파일의 구체적인 위치는 파일 열기 모드(r+ 또는)에 따라 다릅니다. a+ 또는 w+) 또한 현재 탐색 포인터가 파일에서 가리키는 위치에 따라 달라집니다. (또한 파일 내부에 내용을 쓰기 위해 write 메소드를 사용할 경우 개행 문자가 없습니다. 개행 문자를 수동으로 추가해야 합니다. 그렇지 않으면 모든 내용이 서로 달라붙게 됩니다.)

예: f1.write(' hello!n') #n은 개행 문자입니다.

writelines(): wirte와 유사하게 파일 내부에 내용을 씁니다. writelines는 writelines 메서드를 사용하여 목록 형식을 사용합니다. Python은 List 루프를 수행하고 목록의 각 요소가 파일에 기록됩니다.

주의하세요! writeline을 사용하여 파일 내부에 콘텐츠를 쓰는 경우 개행 문자가 없습니다. 각 요소 끝에 개행 문자를 추가하면 목록의 각 요소는 파일의 한 줄이 됩니다.

주의하세요! ! 파일에 기록된 내용은 문자열만 가능하며 다른 유형은 불가능합니다! ! 그렇지 않으면 예외가 발생합니다. 숫자를 쓰더라도 숫자를 문자열 유형으로 변환해야 합니다! ! !

기타 작업:

close()는 파일을 읽거나 쓸 때 파일을 닫으려면 반드시 close를 사용하세요! (with 구문 사용을 제외하고, with 키워드를 사용하여 파일을 열면 파일에 대한 작업이 완료된 후 자동으로 파일이 닫힙니다.)

파일을 읽은 후 닫지 않으면 프로그램이 시스템 리소스를 계속 점유하게 됩니다.

파일을 쓴 후 닫지 않으면 메모리에 있는 내용이 제때에 하드디스크에 동기화되지 않습니다. 하드디스크에 내용을 완전히 쓰고 싶다면 닫기를 사용하여 파일을 닫으세요. 그렇지 않으면 메모리의 데이터를 강제로 하드 디스크로 플러시하는 방법을 사용합니다.

flush()는 하드디스크에 기록되지 않은 메모리의 데이터를 하드디스크에 강제로 플러시합니다.

encoding: 열린 파일의 인코딩을 표시합니다(이 방법은 python2에서는 사용할 수 없지만 python3에서는 사용할 수 있습니다.)

tell(): 현재 파일의 위치를 ​​가져올 수 있습니다. 포인터를 찾으십시오.

seek(포인터 위치, 모드)는 탐색 포인터를 파일의 위치로 바이트 단위로 이동합니다.

pyrhon에는 탐색 포인터를 작동하는 세 가지 모드가 있습니다. 다음은 이 세 가지 모드에 대한 자세한 소개입니다.

file.seek(n,0)#n은 포인터 위치를 나타냅니다. 의 뒤에 있는 숫자 0은 모드의 일련 번호를 나타냅니다.

file.seek(n,0): (모드 0) 모드 0은 절대 위치를 나타냅니다. n이 숫자인 경우 포인터는 파일의 처음부터 바이트 단위로 이동합니다. (Seek 사용시 모드를 지정하지 않으면 기본 모드는 0이다.)

예를 들어 file.seek(3,0)은 포인터를 파일의 시작(0번째 바이트)으로 이동시킨다. 시작 번호, 3바이트 위치.

# 포인터를 사용하기 전

f1 = open('seasons.lrc',mode='r')

print f1.readline()

>>>Hamazaki あゆumi- Seasons

#다음은 0 모드를 사용하여 파일의 3번째 바이트로 포인터를 이동한 후 3번째 바이트로 포인터를 이동한 후 파일을 읽는 방법입니다. 파일은 포인터 뒤에서부터 읽혀집니다.

f1 = open('seasons.txt',mode='r')

print f1.tell() #탐색 포인터의 현재 위치 표시

> ; >>0 # (위치는 0입니다. 이는 포인터가 파일의 시작 부분에 있음을 의미합니다.)

f1.seek(3,0) # (포인터를 세 번째 바이트로 이동하고 다음을 사용합니다. 0 모드, 절대 위치)

print f1.tell() # 포인터 위치를 다시 확인하면 포인터 위치가 실제로 세 번째 바이트로 이동한 것을 확인할 수 있습니다.

>>>3

print f1.readline() #현재 포인터 위치에서 한 줄을 읽습니다.

>> 바이트 뒤에 한 문자가 건너뛰는 이유는 무엇입니까?

문자와 바이트가 무엇인지 이해해야 합니다. ! UTF-8 문자 인코딩에서는 한자가 3바이트를 차지합니다. 첫 번째 줄의 원래 내용은 "Hamazaki あゆumi- Seasons"입니다. 한 한자가 3바이트를 차지하므로 포인터가 3바이트 뒤로 이동합니다. 포인터가 "浜" 뒤로 이동하면 이 문자 뒤에서부터 읽기 시작하므로 "恂あゆumi- Seasons"가 표시됩니다. (UTF-8 문자 인코딩에서는 일본어 문자도 3바이트를 차지합니다.)

나중에 예를 들어 설명하겠습니다. 이 예는 "절대 위치"의 의미를 이해하는 데 도움이 될 수 있습니다.

f1 = open('seasons.lrc',mode='r')

print f1.tell() #파일을 연 후 포인터의 기본 위치는 0입니다.

>>>0

f1.seek(3,0) #파일에서 3바이트 위치로 손가락을 이동합니다.

f1.tell() 인쇄

>>>3

f1.seek(3,0)

f1.tell( )

>>>3

file.seek(n,1): (모드 1) 모드 1, 상대 위치, n은 포인터가 현재 위치에서 뒤로 이동하는 정도를 나타냅니다. 위치 바이트.

제 말이 이해하기 쉽지 않다고 생각되신다면 아래 예시를 읽어보시면 이해하실 수 있을 것입니다.

f1 = open('seasons.lrc',mode='r')

print f1.tell() #파일을 연 후 포인터의 기본 위치는 0입니다.

>>>0

f1.seek(3,1) #포인터를 3바이트 뒤로 이동합니다.

print f1.tell()

>>>3 #포인터가 3번째 바이트 위치로 이동합니다.

f1.seek(3,1) #여기가 핵심입니다. 포인터를 3바이트 뒤로 이동합니다. (여기서 모드 1과 모드 0의 차이를 비교할 수 있습니다.)

print f1 .tell()

>>>6 #포인터의 위치가 6번째 바이트에 있다는 것도 1번 모드가 움직일 때마다 처음부터 시작하지 않고 처음부터 시작한다는 뜻이기도 합니다. 포인터가 마지막에 있던 위치를 기준으로 파일을 뒤로 이동합니다. ('상대적 위치'라는 뜻입니다.)

아직도 이해가 되지 않는다면 아래 보충설명을 읽어보세요.

마지막으로 추가하겠습니다.

f1.seek(3,0)은 포인터를 파일의 세 번째 바이트로 이동하는 것을 의미합니다. (절대 위치)

f1.seek(3,1)은 포인터를 현재 위치에서 3바이트 뒤로 이동한다는 의미입니다. (상대 위치)

file.seek(-n,2): 파일 끝에서 시작하여 파일 처음으로 이동하는 절대 위치를 사용합니다. (2모드 사용시 포인터 이동 위치는 끝부터 시작해서 앞으로 이동하기 때문에 음수만 가능하다는 점 참고해주세요!)

다음은 예시입니다.

#파일 열기, 읽기 방법을 사용하여 파일의 처음부터 끝까지 읽습니다. 파일을 읽으면 포인터가 자연스럽게 파일의 끝으로 다시 이동합니다.

f1 = open('seasons.txt',mode='r')

f1.tell() 인쇄

>>>0

f1.read()

print f1.tell()

>>>756

이제 위의 방법을 통해 파일의 끝이 무엇인지 알 수 있습니다. 파일의 처음 몇 바이트입니다.

Seek 방식의 2-mode 기능이 앞서 언급한 바와 같이 파일의 끝에서 시작하여 파일의 처음으로 이동하는지 테스트해 보겠습니다.

f1 = open('seasons.txt',mode='r')

f1.tell() 인쇄

>>>0

f1.seek(-1,2) # 파일 끝에서 1바이트 앞으로 포인터를 이동하려면 탐색의 2가지 모드를 사용합니다.

print f1.tell()

>>>755

#파일의 끝은 756이고, 한 바이트 앞으로 이동하면 755가 되어 원하는 효과를 얻습니다.

실제로 Seek 메서드의 2가지 모드는 꽤 유용합니다. 다음은 Seek 메서드의 2가지 모드에 대한 자세한 설명입니다.

파일의 마지막 줄에서 1~N번째 줄을 얻으려면 탐색 방법의 2번째 모드를 사용할 수 있습니다.

이때 누군가는 파일의 마지막 줄을 꺼내는 것이 매우 간단한 작업이 아닌가? readlines 메소드를 사용하여 파일을 읽어온 다음 마지막 요소를 가져오면 되지 않느냐고 물을 수도 있습니다. 그러면 마지막 줄을 얻을 수 있습니다. 이 방법이 더 간단하지 않나요?

이렇게요.

f1 = open('seasons.txt',mode='r')

print f1.readlines()[-1]

>>> 파일의 마지막 줄은 실제로 삭제되었지만, 파일을 읽기 위해 readlines를 사용하는 것의 본질은 파일이 매우 큰 경우 파일의 모든 줄을 메모리로 읽는 것입니다. 10G 또는 100G이고 용량이 너무 커서 현재 메모리에 저장할 수 없는 경우에는 이 방법을 적용할 수 없습니다.

다음 방법은 특히 대용량 파일에 적합합니다.

f1 = open('seasons.txt',mode='r')

for i in f1:     #Direct for 루프 파일 핸들은 모든 파일을 한 번에 메모리에서 읽지 않지만 읽습니다. 파일에서 한 줄.

line_bytes = -36

True:

f1.seek(line_bytes,2)

data = f1.readlines()

if len(data) > 1:

인쇄 데이터[-1]

break

else:

line_bytes * 2

위 내용은 Python의 파일 처리에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.