파일에 줄을 쓰는 올바른 방법?


1069

나는 익숙해 print >>f, "hi there"

그러나 print >>더 이상 사용되지 않는 것 같습니다 . 위의 행을 수행하는 권장 방법은 무엇입니까?

업데이트 : 모든 답변과 관련하여 "\n"...이 보편적입니까 아니면 유닉스에만 해당됩니까? IE, "\r\n"Windows 에서해야 합니까?


11
"\ n"은 유닉스 전용이 아닙니다. 파일이 텍스트 모드 (기본값)로 열리면 현재 플랫폼에 대한 올바른 줄로 자동 변환됩니다. "\ r \ n"을 쓰면 "\ r \ r \ n"이 잘못됩니다.
D Coetzee

인쇄 ord (os.linesep) 문을 추가하여 ASCII 코드 (대부분의 UNIX 시스템에서 10 개)를 확인하십시오.
Stefan Gruenwald

왜 더 이상 사용되지 않는다고 생각합니까?
xxx ----

답변:


1152

다음과 같이 간단해야합니다.

with open('somefile.txt', 'a') as the_file:
    the_file.write('Hello\n')

설명서에서 :

os.linesep텍스트 모드에서 열린 파일을 쓸 때 줄 종결 자로 사용하지 마십시오 (기본값). 모든 플랫폼에서 단일 '\ n'을 대신 사용하십시오.

유용한 자료 :


36
이 예는 열기 / 닫기 예보다 낫습니다. 사용 with은 파일을 닫는 것을 기억하는보다 안전한 방법입니다.
Eyal

18
전화 할 필요 없어요 the_file.close()?
Hussain

19
아니오 당신은하지 않습니다 : stackoverflow.com/questions/3012488/…
Tal Jerome

@Johnsyweb 왜 당신은 "os.linesep. os에 좋은 것들이 많이 있습니다!"라고 말합니까? 나는 여기에서 편집을 의심하고 있는데, 이것이 다운 투표의 이유 일 수 있습니다.
Horse SMith

1
@ user3226167 : 흥미로운 점입니다. 그러나 왜 바이너리 파일을 열어서 일반 텍스트를 작성 하시겠습니까?
Johnsyweb

961

print()Python 2.6 이상부터 사용 가능한 함수를 사용해야합니다

from __future__ import print_function  # Only needed for Python 2
print("hi there", file=f)

Python 3의 import경우 print()함수가 기본값 이므로을 필요로하지 않습니다 .

대안은 다음을 사용하는 것입니다.

f = open('myfile', 'w')
f.write('hi there\n')  # python will convert \n to os.linesep
f.close()  # you can omit in most cases as the destructor will call it

줄 바꿈에 관한 파이썬 문서 에서 인용 :

출력시 줄 바꿈이 없음 인 경우 '\n'기록 된 모든 문자는 시스템 기본 줄 구분 기호로 변환됩니다 os.linesep. 개행이 ''인 경우 번역이 수행되지 않습니다. 줄 바꿈이 다른 유효한 값이면 '\n'작성된 문자가 지정된 문자열로 변환됩니다.


35
-1 "확실히 원하면 \n" 대신에 os.linesep를 문자열에 추가하면 newline = "이 필요합니다 \r\r\n. 그렇지 않으면 Windows를 사용할 수 있습니다. os.linesep를 전혀 생각할 이유가 없습니다.
John Machin

7
@Sorin : 쓰기 모드를 추가하기위한 편집은 물론 개선되었습니다. 그러나 당신은 이상하게도 os.linesep에 대해 일시적으로 남아 있습니다. 내 대답을 참조하십시오. 그건 그렇고, 인용하는 문서는 3.x 용이지만이 부분은 텍스트 모드의 2.x에도 유효합니다. 쓰여진 모든 '\ n'문자는 시스템 기본 줄 구분 기호 os.linesep *로 변환 됩니다. .. Windows : os.linesep 작성은 os.linesep로 변환 \r\n되는 포함 과 동일 하므로 최종 결과는 다음과 같습니다 . \n\r\n\r\r\n
John Machin

7
@ 존 당신이 옳았다, 나는 os.linesep 버그를 수정했다. 감사.
sorin

3
open('myfile','a')대신에 추가 하지 open('myfile','w')않습니까?
NeDark

6
@BradRuderman 텍스트 파일에서 "줄"을 구성하는 것에 대한 POSIX 표준 의 일부입니다. 즉, 텍스트 파일의 모든 줄은 줄 바꿈으로 끝나야합니다.
휠러

116

파이썬 문서는 이 방법을 권장합니다 :

with open('file_to_write', 'w') as f:
    f.write('file contents\n')

그래서 이것이 내가 보통하는 방식입니다 :)

에서 문 docs.python.org :

파일 객체를 다룰 때 'with' 키워드 를 사용하는 것이 좋습니다 . 이는 도중에 예외가 발생하더라도 스위트가 완료된 후 파일이 올바르게 닫히는 이점이 있습니다. 또한 동등한 try-finally 블록을 작성하는 것보다 훨씬 짧습니다.


1
with내부 루프 를 중첩해야 할 때이 방법이 마음에 들지 않습니다 . 루프를 진행하면서 파일을 지속적으로 열고 닫습니다. 어쩌면 여기에 뭔가 빠졌 거나이 특정 시나리오에서 실제로 단점입니까?
Sibbs Gambling

38
with 내에서 루핑은 어떻습니까?
j7nn7k

fd에서 줄을위한 @ j7nn7k :
momstouch

86

os.linesep에 관하여 :

다음은 Windows에서 편집되지 않은 Python 2.7.1 인터프리터 세션입니다.

Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.linesep
'\r\n'
>>> f = open('myfile','w')
>>> f.write('hi there\n')
>>> f.write('hi there' + os.linesep) # same result as previous line ?????????
>>> f.close()
>>> open('myfile', 'rb').read()
'hi there\r\nhi there\r\r\n'
>>>

Windows에서 :

예상대로 os.linesep는와 같은 결과를 생성 하지 않습니다'\n' . 동일한 결과를 얻을 수있는 방법은 없습니다. 'hi there' + os.linesep와 같 'hi there\r\n'으며 이는에 해당 하지 않습니다'hi there\n' .

이 간단합니다 : 사용 \n은 자동으로 os.linesep로 번역됩니다. 그리고 파이썬의 첫 포트부터 Windows까지 그렇게 간단했습니다.

Windows 이외의 시스템에서는 os.linesep를 사용할 필요가 없으며 Windows에서는 잘못된 결과를 생성합니다.

os.linesep를 사용하지 마십시오!


좋은 예-ipython 사용자인지 궁금하십니까? 세션 포맷을위한 훌륭한 기능
Alvin

나는 당신이 여기에 무엇을 말하려고하는지 완전히 확신하지 못합니다. os.linesep는 운영 체제에서 정의한대로 줄 용어 문자 (또는 문자열)를 반환합니다. Windows는 기본적으로 줄 끝에 \ r \ n을 사용합니다. 그러나 단일 \ n이 인식됩니다. \ n을 사용하면 완전히 이식 가능한 OUTPUT을 제공하지만 os.linesep는 Windows에서 잘못되지 않습니다.
Gusdor

5
@Gusdor : 요점은 os.linesepWindows에서 텍스트 모드로 명시 적으로 사용 하면 결과 \r\r\n가 잘못 된다는 것입니다. "Windows uses ..."는 의미가 없습니다. C 런타임 라이브러리 (따라서 파이썬) 번역 \n\r\n텍스트 모드에서 출력합니다. 다른 소프트웨어는 다르게 작동 할 수 있습니다. \n텍스트 모드에서 읽을 때 Windows에서 실행되는 모든 소프트웨어가 고독 을 줄 구분자로 인식하는 것은 아닙니다 . 파이썬은 그렇습니다. Microsoft의 메모장 텍스트 편집기는 그렇지 않습니다.
John Machin 2019

6
틀림없이 다른 사람은 추가에 대해 발프 몇 가지 미키 마우스 소프트웨어와 함께, 당신을 그것을 읽는되지는 않습니다 \r...
존 머신

2
@Gusdor는 다른 언어에서 파이썬으로오고 있습니다. '\ n'을 사용하면 '\ r \ n'이 아닌 창에서 '\ n'이 출력됩니다. 따라서 바보처럼 예상되는 '\ r'이 없습니다. 텍스트 편집기? John이 말했듯이, 그것은 파이썬이 동작하는 방식이 아닙니다-os.linesep가 말한 것처럼 '\ n'은 자동으로 '\ r \ n'으로 바뀝니다. 그러므로 여기에서 명시 적으로 말하는 os.linesep 것은 "잘못"입니다. 그 것처럼 Department of Redundancy Department. 네 할 수 있습니다. 아니요, 원하지 않습니다.
ToolmakerSteve

55

나는 "올바른"방법이 없다고 생각합니다.

나는 사용할 것이다 :

with open ('myfile', 'a') as f: f.write ('hi there\n')

추모 팀 토디 .


그러나 OP는 파일에 추가 내용을 쓰려고 할 수 있습니다. 여기서 파일이 with범위를 벗어나면 닫힙니다 .
Keith

open(..., 'a')또는 원할 수도 있습니다 'at'.
mtrw

5
음. 그것이 함께 사용하는 아이디어입니다. 파일을 열어 두려면 처음에 open (전화 열기)로 전화를 마치고 전화를
끊으십시오

1
@mtrw. 진실. OP가 추가되었습니다.
Hyperboreus

1
파이썬에 관한 한 RIP Tim
Toady는

21

Python 3에서는 함수이지만 Python 2에서는 소스 파일 맨 위에 이것을 추가 할 수 있습니다.

from __future__ import print_function

그런 다음에

print("hi there", file=f)

17

많은 양의 데이터를 작성하고 속도가 문제가된다면 아마도 함께 가야합니다 f.write(...). 빠른 속도 비교를 print(..., file=f)수행했으며 많은 수의 쓰기를 수행 할 때보 다 훨씬 빠릅니다 .

import time    

start = start = time.time()
with open("test.txt", 'w') as f:
    for i in range(10000000):
        # print('This is a speed test', file=f)
        # f.write('This is a speed test\n')
end = time.time()
print(end - start)

write내 컴퓨터에서 평균 2.45 초에 완료되었지만 print약 4 배 (9.76 초) 걸렸습니다. 그러나 대부분의 실제 시나리오에서는 이것이 문제가되지 않습니다.

print(..., file=f)당신이 함께 갈 것을 선택 하면 아마 개행을 때때로 억제하거나 다른 것으로 대체하고 싶을 것입니다. 옵션 end파라미터 를 설정하면됩니다 .

with open("test", 'w') as f:
    print('Foo1,', file=f, end='')
    print('Foo2,', file=f, end='')
    print('Foo3', file=f)

어떤 방법을 선택하든 with코드를 훨씬 쉽게 읽을 수 있으므로 사용하는 것이 좋습니다 .

업데이트 :이 성능 차이는 write디스크에 쓰기 작업이 실제로 발생하기 전에 버퍼링되고 반환 되는 사실에 의해 설명됩니다 ( 이 답변 참조 ). print(아마도) 라인 버퍼링을 사용합니다. 이를위한 간단한 테스트는 라인 버퍼링에 대한 단점 (속도 측면)이 덜 두드러지는 긴 쓰기의 성능을 검사하는 것입니다.

start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
    for i in range(1000000):
        # print(long_line, file=f)
        # f.write(long_line + '\n')
end = time.time()

print(end - start, "s")

성능 차이는 이제 훨씬 덜 두드러지고 평균 시간은 2.20 초 write, 3.10 초입니다 print. 이 loooong 라인 성능을 얻기 위해 많은 문자열을 연결 해야하는 경우 print더 효율적인 사용 사례 는 약간 드 rare니다.


10

3.5부터는 pathlib그 목적으로 도 사용할 수 있습니다 .

Path.write_text(data, encoding=None, errors=None)

텍스트 모드에서 지정된 파일을 열고 데이터를 쓴 다음 파일을 닫습니다.

import pathlib

pathlib.Path('textfile.txt').write_text('content')

5

Line이라고 말하면 '\ n'문자로 끝나는 직렬화 된 문자를 의미합니다. 줄은 어느 시점에서 마지막에 있어야하므로 각 줄 끝에서 '\ n'을 고려해야합니다. 해결책은 다음과 같습니다.

with open('YOURFILE.txt', 'a') as the_file:
    the_file.write("Hello")

각 쓰기 후 추가 모드에서 커서를 새 줄로 이동합니다. w모드 를 사용 \n하려면 write()함수 끝에 문자를 추가해야 합니다.

the_file.write("Hello\n")

1
"각 쓰기 후 추가 모드에서 커서가 새 줄로 이동합니다."아닙니다.
An Se

3

다음 io과 같이 모듈을 사용할 수도 있습니다 .

import io
my_string = "hi there"

with io.open("output_file.txt", mode='w', encoding='utf-8') as f:
    f.write(my_string)

1

플라스크의 파일에 텍스트를 쓰려면 다음을 사용할 수 있습니다.

filehandle = open("text.txt", "w")
filebuffer = ["hi","welcome","yes yes welcome"]
filehandle.writelines(filebuffer)
filehandle.close()

0

시도해 볼 수도 있습니다 filewriter

pip install filewriter

from filewriter import Writer

Writer(filename='my_file', ext='txt') << ["row 1 hi there", "row 2"]

에 쓴다 my_file.txt

iterable 또는 __str__지원 되는 객체를 가져옵니다 .


0

새 줄을 많이 써야 할 때 print함수 를 사용하는 람다를 정의 합니다.

out = open(file_name, 'w')
fwl = lambda *x, **y: print(*x, **y, file=out) # FileWriteLine
fwl('Hi')

이 방법은 기능과 함께 사용할 수있는 모든 기능을 활용할 수 있다는 이점이 있습니다 print.

업데이트 : 의견 섹션에서 Georgy 가 언급 했듯이이partial 기능을 사용 하여이 아이디어를 더 향상시킬 수 있습니다.

from functools import partial
fwl = partial(print, file=out)

IMHO, 이것은보다 기능적이고 덜 암호적인 접근 방식입니다.


2
또는 이것을 작성하는 다른 (아마도 더 깨끗한) 방법 : from functools import partial; fwl = partial(print, file=out).
Georgy

@Georgy 귀하의 접근 방식은 너무 좋아서 새로운 답변으로 제공 될 수 있습니다.
MxNx

1
아이디어는 귀하의 아이디어와 동일하며 구현 방식이 약간 다릅니다. 원하는 경우 답변을 수정하여 추가 할 수 있습니다. 난 괜찮아
Georgy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.