파이썬에서 파일에 어떻게 추가합니까?


1573

파일을 덮어 쓰지 않고 파일에 어떻게 추가합니까? 파일에 추가되는 특수 기능이 있습니까?

답변:


2448
with open("test.txt", "a") as myfile:
    myfile.write("appended text")

10
튜토리얼의 이것도 유용 할 수 있습니다.
Dan

28
많은 사람들이이 with open(file, "a")방법을 사용하고 있음을 알았습니다 . 나는 구식이지만 어쩌면 장점은 무엇입니까open(file, "a") ... file.close()

75
bluewoodtree : 이점은 C ++의 RAII와 비슷합니다. close ()를 잊어 버린 경우 파일이 실제로 닫히는 데 시간이 걸릴 수 있습니다. 코드에 여러 개의 종료점, 예외 등이있는 경우 잊어 버리는 것이 더 쉽습니다.
Petter

54
print("appended text", file=myfile)더 친숙한 API에 대해서도 가능합니다.
Thomas Ahle

6
@Tom : 아니요. open()하드 코딩하지 않습니다 utf-8. 사용합니다 locale.getpreferredencoding(False). 패스 encoding="utf-8"를 명시 적으로 알고 그 파일을 사용하는 UTF-8 인코딩을 매개 변수입니다.
jfs

206

"a"또는 "ab"를 모드로 설정하여 추가 모드에서 파일을 열어야합니다. open ()을 참조하십시오 .

"a"모드로 열면 쓰기 위치는 항상 파일의 끝에 있습니다 (첨부 파일). "a +"로 열면 읽을 수 있고 뒤로 탐색하고 읽을 수 있습니다 (그러나 모든 쓰기는 여전히 파일 끝에 있습니다!).

예:

>>> with open('test1','wb') as f:
        f.write('test')
>>> with open('test1','ab') as f:
        f.write('koko')
>>> with open('test1','rb') as f:
        f.read()
'testkoko'

참고 : 'a'를 사용하는 것은 'w'로 열고 파일 끝을 찾는 것과 다릅니다. 다른 프로그램이 파일을 열고 찾기와 쓰기 사이에 쓰기를 시작하면 어떤 일이 발생할 수 있는지 고려하십시오. 일부 운영 체제에서 'a'를 사용하여 파일을 열면 다음 쓰기가 모두 파일 끝에 원자 적으로 추가됩니다 (파일이 다른 쓰기에 의해 증가하더라도).


"a"모드의 작동 방식에 대한 몇 가지 세부 사항 ( Linux에서만 테스트 됨 ). 다시 검색하더라도 모든 쓰기는 파일 끝에 추가됩니다.

>>> f = open('test','a+') # Not using 'with' just to simplify the example REPL session
>>> f.write('hi')
>>> f.seek(0)
>>> f.read()
'hi'
>>> f.seek(0)
>>> f.write('bye') # Will still append despite the seek(0)!
>>> f.seek(0)
>>> f.read()
'hibye'

실제로 fopen 맨 페이지 는 다음 과 같이 말합니다.

추가 모드 (파일의 첫 번째 문자)에서 파일을 열면이 스트림에 대한 모든 후속 쓰기 작업이 마치 호출 앞에 오는 것처럼 파일 끝에서 발생합니다.

fseek(stream, 0, SEEK_END);

이전 간단한 답변 (을 사용하지 않음 with)

예 : ( 실제 프로그램 에서 파일을 닫는 데 사용with - 설명서 참조 )

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'

3
당신은 필요하지 않습니다 close()?
Jonas Stein

9
@JonasStein, 당신은 사용해야합니다 with- 볼 docs.python.org/2/whatsnew/2.6.html#pep-343-the-with-statement
sinelaw

Windows에서 텍스트 파일에 쓰는 경우 "test"대신 "test.txt"를 사용하십시오.
ambassallo

파일이 다른 시점에서 작성을 마치지만 파일 끝이 아닌 시점이 궁금합니다.
이크 라.

49

난 항상 이렇게 해요

f = open('filename.txt', 'a')
f.write("stuff")
f.close()

간단하지만 매우 유용합니다.


12
f : f.write ( 'stuff')
Sam Redway

2
"a +"가 "a"보다 낫습니다
Dell pk

6
몇 년 전에 게시 된 대부분의 답변보다 간단하지 않으며 더 이상 유용하지 않습니다.
Tim

2
@Tim Castelijns 누군가가 여러 위치에서 변수를 사용하는 경우 항상 사용하고 싶지 않은 with 구문의 대안을 게시 한 것이 좋습니다.
marsh

2
@marsh f변수를 다른 함수에 전달하더라도 파일을 여는 동일한 함수가 변수를 닫아야합니다. with구문은이를 달성하는 바람직한 방법이다.
앤드류 팔머

35

아마도 "a"모드 인수 로 전달하고 싶을 것입니다 . open ()에 대한 문서를 참조하십시오 .

with open("foo", "a") as f:
    f.write("cool beans...")

업데이트 (+), 절단 (w) 및 이진 (b) 모드에 대한 모드 인수의 다른 순열이 있지만 시작하는 "a"것이 가장 좋습니다.


20
file내장 함수를 음영 처리합니다. 변수에는 사용하지 마십시오.
Mark Tolonen

11
@MarkTolonen : file은 더 이상 Python 3에 내장되어 있지 않습니다. Python 2에서도 매우 드물게 사용됩니다 . 파일 열기는 일반적인 작업입니다. file여기서는 파이썬 2와 3 모두에서 이름 을 사용 하는 것이 좋습니다.
jfs

34

파이썬은 주요 세 가지 모드 중에서 많은 변형이 있습니다.이 세 가지 모드는 다음과 같습니다.

'w'   write text
'r'   read text
'a'   append text

따라서 파일에 추가하는 것은 다음과 같이 쉽습니다.

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

그런 다음 코드를 더 적은 줄로 만드는 모드가 있습니다.

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text

마지막으로 이진 형식의 읽기 / 쓰기 모드가 있습니다.

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary

14

이 행을 사용할 때 파일을 추가 open(filename, "a")한다는 a것을 나타내므로 기존 파일에 추가 데이터를 삽입 할 수 있습니다.

다음 줄을 사용하여 파일에 텍스트를 추가 할 수 있습니다

def FileSave(filename,content):
    with open(filename, "a") as myfile:
        myfile.write(content)

FileSave("test.txt","test1 \n")
FileSave("test.txt","test2 \n")

9

print대신 다음과 write같이 할 수도 있습니다 .

with open('test.txt', 'a') as f:
    print('appended text', file=f)

경우 TEST.TXT가 존재하지 않는, 그것은 생성됩니다 ...


1
이것은 더 많은 찬사를받을 가치가 있습니다! 이것은 추가 로직없이 엔드 라인을 올바르게 추가하는 가장 쉬운 방법입니다.
Przemysław Czechowski

당신은 또한 플래그를 가질 수 있고 WRITE_TO_FILE = open('my_file.txt', mode='a'), 프로그램 동안 당신은 몇가지 같은 인쇄물을 가질 수 있으며 print('Hello world', file=WRITE_TO_FILE), 콘솔에서 출력을보기로 결정할 때마다 플래그를로 변경하십시오 WRITE_TO_FILE = None. 파일이 없으면 파일을 닫는 것을 잊지 마십시오None
Alaa M.

6

파일을 r+모드 에서 연 다음 파일 위치를 파일 끝으로 설정할 수도 있습니다.

import os

with open('text.txt', 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

에서 파일 열기 r+모드하면 잠시, 말 외에 다른 파일 위치에 기록하게됩니다 aa+끝까지 힘 쓰기입니다.


4

파일에 추가하려는 경우

with open("test.txt", "a") as myfile:
    myfile.write("append me")

우리는 myfile이라는 파일을 열 도록 변수 를 선언했습니다 test.txt. Open은 우리가 열고 자하는 파일과 파일에 대해 수행하려는 권한 또는 작업의 종류를 나타내는 문자열 인 2 개의 인수를 취합니다.

파일 모드 옵션은 다음과 같습니다

모드 설명

'r'기본 모드입니다. 읽을 파일을 엽니 다.
'w'이 모드 쓰기 위해 파일을 엽니 다. 
파일이 없으면 새 파일을 작성합니다.
파일이 있으면 파일을 자릅니다.
'x'새 파일을 만듭니다. 파일이 이미 존재하면 작업이 실패합니다.
'a'추가 모드에서 파일을 엽니 다. 
파일이 없으면 새 파일을 작성합니다.
't'기본 모드입니다. 텍스트 모드로 열립니다.
'b'바이너리 모드로 열립니다.
'+'읽기 및 쓰기 (업데이트)를위한 파일을 엽니 다.

4

'a'매개 변수는 추가 모드를 나타냅니다. with open매번 사용하고 싶지 않다면 쉽게 사용할 수있는 함수를 작성할 수 있습니다.

def append(txt='\nFunction Successfully Executed', file):
    with open(file, 'a') as f:
        f.write(txt)

끝이 아닌 다른 곳에 쓰려면 'r+' 을 사용할 수 있습니다 .

import os

with open(file, 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

마지막 'w+'으로이 매개 변수는 더 많은 자유를 부여합니다. 특히, 파일이 존재하지 않는 경우 파일을 작성하고 현재 존재하는 파일의 내용을 비울 수 있습니다.


이 기능에 대한 크레딧은 @Primusa로갑니다


2

파일 끝에 더 많은 텍스트를 추가하는 가장 간단한 방법은 다음을 사용하는 것입니다.

with open('/path/to/file', 'a+') as file:
    file.write("Additions to file")
file.close()

a+open(...)문에 지시는 추가 모드에서 파일을 열고 읽기 및 쓰기 액세스를 허용합니다.

또한 file.close()파일을 사용한 후에는 연 파일을 모두 닫는 것이 좋습니다.


1
"with."블록의 끝에 "file.close"가 자동으로 호출되는데, 이는 키워드의 장점입니다. 또한 OP는 파일을 추가하여 추가 할 것인지 물었습니다. "+"모드는 읽고 싶지 않으면 필요하지 않습니다.
Erik Knowles

-6

다음은 기본적으로 줄 수를 계산 한 다음 추가하고 다시 계산하여 작동 한 증거가있는 스크립트입니다.

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.