수색…


소개

데이터 저장, 읽기 또는 통신과 관련하여 운영 체제의 파일 작업은 파이썬에서 필요하고 쉽습니다. 파일 입출력이 복잡한 읽기 및 쓰기 객체를 필요로하는 다른 언어와 달리 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+' - 읽기 모드와 쓰기 모드를 동시에 선택합니다. 이렇게하면 rw 를 사용하지 않고도 동시에 파일을 읽고 쓸 수 있습니다.

  • '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 방식으로 작성하도록 허용하십시오.

Python 3.x 3.3
try:
    with open("fname", "r") as fout:
        # Work with your open file
except FileExistsError:
    # Your error handling goes here

파이썬 2에서는 다음과 같이했을 것이다.

Python 2.x 2.0
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에서는 다르지만 개념은 화면으로 갔을 출력을 대신 파일로 보낼 수 있다는 점에서 동일합니다.

Python 3.x 3.0
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에서는 다음과 같이했을 것이다.

Python 2.x 2.0
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')
    
파이썬 3.x 3.4
  • 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은 "."일 수 있습니다. 현재 디렉토리 또는 다른 경로에서 시작합니다.

Python 3.x 3.5

파일에 대한 정보를 얻으려면 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 값을 반환합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow