나는 익숙해 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’을 대신 사용하십시오.
유용한 자료 :
with
문open()
- ‘a’는 추가 또는 사용을위한 것입니다
- 자르기로 쓰는 ‘w’
os
(특히os.linesep
)
답변
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니다.