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

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

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

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



답변

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

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

설명서에서 :

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

유용한 자료 :


답변

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'작성된 문자가 지정된 문자열로 변환됩니다.


답변

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

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

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

에서 문 docs.python.org :

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


답변

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를 사용하지 마십시오!


답변

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

나는 사용할 것이다 :

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

추모 팀 토디 .


답변

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

from __future__ import print_function

그런 다음에

print("hi there", file=f)


답변

많은 양의 데이터를 작성하고 속도가 문제가된다면 아마도 함께 가야합니다 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니다.