Python Language
파일 및 폴더 I / O
수색…
소개
데이터 저장, 읽기 또는 통신과 관련하여 운영 체제의 파일 작업은 파이썬에서 필요하고 쉽습니다. 파일 입출력이 복잡한 읽기 및 쓰기 객체를 필요로하는 다른 언어와 달리 Python은 파일을 열고, 읽고 쓰고, 닫는 명령 만 필요한 프로세스를 단순화합니다. 이 항목에서는 Python이 운영 체제의 파일과 어떻게 상호 작용하는지 설명합니다.
통사론
- file_object = open (파일 이름 [, access_mode] [, 버퍼링])
매개 변수
매개 변수 | 세부 |
---|---|
파일 이름 | 파일의 경로 또는 파일이 작업 디렉토리에 있으면 파일의 파일 이름 |
액세스 _ 모드 | 파일이 열리는 방법을 결정하는 문자열 값 |
완충 작용 | 선택적인 라인 버퍼링에 사용되는 정수 값 |
비고
크로스 플랫폼 인코딩 지옥 피하기
파이썬의 내장형 open()
을 사용할 때 코드가 크로스 플랫폼으로 실행되도록하려면 encoding
인수를 항상 전달하는 것이 가장 좋습니다. 그 이유는 시스템의 기본 인코딩이 플랫폼마다 다르다는 것입니다.
linux
시스템은 실제로 utf-8
을 기본값으로 사용하지만, MAC 및 Windows 에서는 반드시 그런 것은 아닙니다 .
시스템의 기본 인코딩을 확인하려면 다음을 시도하십시오.
import sys
sys.getdefaultencoding()
모든 파이썬 인터프리터에서.
따라서 인코딩하는 코드를 항상 구분하여 작업중인 문자열이 생각한대로 인코딩되고 플랫폼 간 호환성을 보장하는 것이 좋습니다.
with open('somefile.txt', 'r', encoding='UTF-8') as f:
for line in f:
print(line)
파일 모드
mode
매개 변수로 지정된 파일을 열 수있는 여러 가지 모드가 있습니다. 여기에는 다음이 포함됩니다.
'r'
읽기 모드. 기본값. 파일을 읽지 않고 수정할 수 있습니다. 이 모드를 사용할 때 파일이 있어야합니다.'w'
쓰기 모드. 파일이 없으면 새 파일을 만들고 그렇지 않으면 파일을 지우고 파일에 쓸 수 있습니다.'a'
a'- 추가 모드. 파일의 끝에 데이터를 씁니다. 파일을 지우지 않고 파일이이 모드에 존재해야합니다.'rb'
바이너리 모드 읽기. 이는 읽기가 2 진 모드로 강제 실행된다는 점을 제외하고는r
과 유사합니다. 이것은 또한 기본 선택입니다.'r+'
- 읽기 모드와 쓰기 모드를 동시에 선택합니다. 이렇게하면r
및w
를 사용하지 않고도 동시에 파일을 읽고 쓸 수 있습니다.'rb+'
- 바이너리로 읽기 및 쓰기 모드. 데이터가 2 진수 인 경우를 제외하고r+
와 같습니다.'wb'
바이너리 모드 쓰기. 데이터가 2 진수 인 경우를 제외하고w
와 동일합니다.'w+'
- 쓰기 및 읽기 모드.r+
와 완전히 같지만 파일이 존재하지 않으면 새로운 파일이 만들어집니다. 그렇지 않으면 파일을 덮어 씁니다.'wb+'
- 바이너리 모드에서 쓰기 및 읽기 모드.w+
같지만 데이터는 바이너리입니다.'ab'
바이너리 모드로 추가. 데이터가 2 진수 인 점을 제외하면a
와 유사합니다.'a+'
- 추가 및 읽기 모드. 파일이 존재하지 않으면 새로운 파일을 생성하므로w+
와 유사합니다. 그렇지 않으면, 파일 포인터는 파일 끝에 존재합니다.'ab+'
- 추가 및 바이너리 모드 읽기. 데이터가 바이너리 인 점을 제외하면a+
와 같습니다.with open(filename, 'r') as f: f.read() with open(filename, 'w') as f: f.write(filedata) with open(filename, 'a') as f: f.write('\n' + newdata)
아르 자형 | r + | w | w + | 에이 | a + | |
---|---|---|---|---|---|---|
독서 | ✔ | ✔ | ✘ | ✔ | ✘ | ✔ |
쓰다 | ✘ | ✔ | ✔ | ✔ | ✔ | ✔ |
파일을 만듭니다. | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ |
파일 지우기 | ✘ | ✘ | ✔ | ✔ | ✘ | ✘ |
초기 위치 | 스타트 | 스타트 | 스타트 | 스타트 | 종료 | 종료 |
파이썬 3은 우연히 자르거나 기존 파일을 덮어 쓰지 않도록 exclusive creation
위한 새로운 모드를 추가했습니다.
-
'x'
FileExistsError
독점적 인 생성을 위해 열면 파일이 이미 존재하면FileExistsError
발생시킵니다. -
'xb'
바이너리로 독점 작성 모드를 위해 열립니다. 데이터가 바이너리 인 점을 제외하면x
와 동일합니다. -
'x+'
- 읽기 및 쓰기 모드. 파일이 존재하지 않으면 새로운 파일을 생성하므로w+
와 유사합니다. 그렇지 않으면FileExistsError
합니다. -
'xb+'
- 쓰기 및 읽기 모드.x+
와 정확히 같지만 데이터는 바이너리입니다.
엑스 | x + | |
---|---|---|
독서 | ✘ | ✔ |
쓰다 | ✔ | ✔ |
파일을 만듭니다. | ✔ | ✔ |
파일 지우기 | ✘ | ✘ |
초기 위치 | 스타트 | 스타트 |
파일 열기 코드를 더 pythonic 방식으로 작성하도록 허용하십시오.
try:
with open("fname", "r") as fout:
# Work with your open file
except FileExistsError:
# Your error handling goes here
파이썬 2에서는 다음과 같이했을 것이다.
import os.path
if os.path.isfile(fname):
with open("fname", "w") as fout:
# Work with your open file
else:
# Your error handling goes here
파일을 한 줄씩 읽음
파일을 한 줄씩 반복하는 가장 간단한 방법은 다음과 같습니다.
with open('myfile.txt', 'r') as fp:
for line in fp:
print(line)
readline()
은 행 단위 반복에 대한보다 세밀한 제어를 허용합니다. 아래 예제는 위의 예제와 같습니다.
with open('myfile.txt', 'r') as fp:
while True:
cur_line = fp.readline()
# If the result is an empty string
if cur_line == '':
# We have reached the end of the file
break
print(cur_line)
for 루프 반복자와 readline ()을 함께 사용하는 것은 나쁜 습관으로 간주됩니다.
보다 일반적으로, readlines()
메서드는 반복 가능한 파일 행 모음을 저장하는 데 사용됩니다.
with open("myfile.txt", "r") as fp:
lines = fp.readlines()
for i in range(len(lines)):
print("Line " + str(i) + ": " + line)
그러면 다음과 같이 인쇄됩니다.
0 행 : 안녕하세요.
1 호선 : 세계
파일의 전체 내용 가져 오기
파일 I / O의 선호되는 방법은 with
키워드를 사용하는 것 with
. 이렇게하면 읽기 또는 쓰기가 완료되면 파일 핸들이 닫힙니다.
with open('myfile.txt') as in_file:
content = in_file.read()
print(content)
또는 수동으로 파일을 닫는 처리하기 위해, 당신은 포기할 수 with
단순히 전화를 close
자신을 :
in_file = open('myfile.txt', 'r')
content = in_file.read()
print(content)
in_file.close()
with
문을 사용하지 않고 예기치 않은 예외가 발생할 경우에 대비하여 실수로 파일을 열어 둘 수 있습니다.
in_file = open('myfile.txt', 'r')
raise Exception("oops")
in_file.close() # This will never be called
파일에 쓰기
with open('myfile.txt', 'w') as f:
f.write("Line 1")
f.write("Line 2")
f.write("Line 3")
f.write("Line 4")
myfile.txt
를 열면 내용이 다음과 같이 표시됩니다.
라인 1 라인 2 라인 3 라인 4
파이썬은 줄 바꿈을 자동으로 추가하지 않으므로 수동으로해야합니다.
with open('myfile.txt', 'w') as f:
f.write("Line 1\n")
f.write("Line 2\n")
f.write("Line 3\n")
f.write("Line 4\n")
1 호선
2 호선
3 호선
4 호선
텍스트 모드로 열린 파일을 작성할 때 줄 종결 os.linesep
을 사용하지 마십시오 (기본값). 대신 \n
사용하십시오.
인코딩을 지정하려면 encoding
매개 변수를 open
함수에 추가하기 만하면됩니다.
with open('my_file.txt', 'w', encoding='utf-8') as f:
f.write('utf-8 text')
print 문을 사용하여 파일에 쓸 수도 있습니다. 역학은 파이썬 2와 파이썬 3에서는 다르지만 개념은 화면으로 갔을 출력을 대신 파일로 보낼 수 있다는 점에서 동일합니다.
with open('fred.txt', 'w') as outfile:
s = "I'm Not Dead Yet!"
print(s) # writes to stdout
print(s, file = outfile) # writes to outfile
#Note: it is possible to specify the file parameter AND write to the screen
#by making sure file ends up with a None value either directly or via a variable
myfile = None
print(s, file = myfile) # writes to stdout
print(s, file = None) # writes to stdout
파이썬 2에서는 다음과 같이했을 것이다.
outfile = open('fred.txt', 'w')
s = "I'm Not Dead Yet!"
print s # writes to stdout
print >> outfile, s # writes to outfile
쓰기 기능을 사용하는 것과는 달리, 인쇄 기능은 자동으로 줄 바꿈을 추가합니다.
한 파일의 내용을 다른 파일로 복사
with open(input_file, 'r') as in_file, open(output_file, 'w') as out_file:
for line in in_file:
out_file.write(line)
-
shutil
모듈 사용 :
import shutil
shutil.copyfile(src, dst)
파일이나 경로가 있는지 확인하십시오.
EAFP 코딩 스타일을 사용하여 열어 try
.
import errno
try:
with open(path) as f:
# File exists
except IOError as e:
# Raise the exception if it is not ENOENT (No such file or directory)
if e.errno != errno.ENOENT:
raise
# No such file or directory
또한 다른 프로세스가 파일을 수표와 사용 된 시점 사이에 삭제하면 경쟁 조건을 피할 수 있습니다. 이 경쟁 조건은 다음과 같은 경우에 발생할 수 있습니다.
os
모듈 사용 :import os os.path.isfile('/path/to/some/file.txt')
pathlib
사용 :import pathlib path = pathlib.Path('/path/to/some/file.txt') if path.is_file(): ...
특정 경로가 존재하는지 여부를 확인하려면 위의 EAFP 절차를 따르거나 경로를 명시 적으로 확인할 수 있습니다.
import os
path = "/home/myFiles/directory1"
if os.path.exists(path):
## Do stuff
디렉토리 트리 복사
import shutil
source='//192.168.1.2/Daily Reports'
destination='D:\\Reports\\Today'
shutil.copytree(source, destination)
대상 디렉토리 가 이미 존재하지 않아야합니다 .
파일 반복 (재귀 적으로)
하위 디렉토리를 포함한 모든 파일을 반복하려면 os.walk를 사용하십시오.
import os
for root, folders, files in os.walk(root_dir):
for filename in files:
print root, filename
root_dir은 "."일 수 있습니다. 현재 디렉토리 또는 다른 경로에서 시작합니다.
파일에 대한 정보를 얻으려면 os.scandir 과 같은보다 효율적인 방법을 사용할 수 있습니다.
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
다양한 라인 사이의 파일 읽기
그래서 파일의 특정 라인 사이에서만 반복하고 싶다고 가정 해 봅시다.
당신은 그것을 위해 itertools
를 사용할 수 있습니다.
import itertools with open('myfile.txt', 'r') as f: for line in itertools.islice(f, 12, 30): # do something here
이것은 파이썬 색인 생성이 0에서 시작하는 것처럼 13에서 20 행을 읽습니다. 따라서 줄 번호 1은 0으로 색인됩니다
마찬가지로 next()
키워드를 사용하여 추가 행을 읽을 수도 있습니다.
그리고 파일 객체를 반복 가능한 것으로 사용할 때 파일을 가로 지르는 두 가지 기술을 함께 사용해서는 readline()
때문에 readline()
문을 사용하지 마십시오.
mmap을 사용하는 무작위 파일 액세스
mmap
모듈을 사용하면 사용자가 파일을 메모리에 매핑하여 파일의 위치에 무작위로 액세스 할 수 있습니다. 이는 일반 파일 조작을 사용하는 것의 대안입니다.
import mmap
with open('filename.ext', 'r') as fd:
# 0: map the whole file
mm = mmap.mmap(fd.fileno(), 0)
# print characters at indices 5 through 10
print mm[5:10]
# print the line starting from mm's current position
print mm.readline()
# write a character to the 5th index
mm[5] = 'a'
# return mm's position to the beginning of the file
mm.seek(0)
# close the mmap object
mm.close()
파일에서 텍스트 바꾸기
import fileinput
replacements = {'Search1': 'Replace1',
'Search2': 'Replace2'}
for line in fileinput.input('filename.txt', inplace=True):
for search_for in replacements:
replace_with = replacements[search_for]
line = line.replace(search_for, replace_with)
print(line, end='')
파일이 비어 있는지 확인하기
>>> import os
>>> os.stat(path_to_file).st_size == 0
또는
>>> import os
>>> os.path.getsize(path_to_file) > 0
그러나 파일이 존재하지 않으면 두 가지 모두 예외가 발생합니다. 이러한 오류를 포착하지 않으려면 다음과 같이하십시오.
import os
def is_empty_file(fpath):
return os.path.isfile(fpath) and os.path.getsize(fpath) > 0
bool
값을 반환합니다.