나는 익숙해 print >>f, "hi there"
그러나 print >>더 이상 사용되지 않는 것 같습니다 . 위의 행을 수행하는 권장 방법은 무엇입니까?
업데이트 : 모든 답변과 관련하여 "\n"...이 보편적입니까 아니면 유닉스에만 해당됩니까? IE, "\r\n"Windows 에서해야 합니까?
나는 익숙해 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()
os(특히 os.linesep)with은 파일을 닫는 것을 기억하는보다 안전한 방법입니다.
the_file.close()?
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'작성된 문자가 지정된 문자열로 변환됩니다.
\n" 대신에 os.linesep를 문자열에 추가하면 newline = "이 필요합니다 \r\r\n. 그렇지 않으면 Windows를 사용할 수 있습니다. os.linesep를 전혀 생각할 이유가 없습니다.
\r\n되는 포함 과 동일 하므로 최종 결과는 다음과 같습니다 . \n\r\n\r\r\n
open('myfile','a')대신에 추가 하지 open('myfile','w')않습니까?
파이썬 문서는 이 방법을 권장합니다 :
with open('file_to_write', 'w') as f:
f.write('file contents\n')
그래서 이것이 내가 보통하는 방식입니다 :)
에서 문 docs.python.org :
파일 객체를 다룰 때 'with' 키워드 를 사용하는 것이 좋습니다 . 이는 도중에 예외가 발생하더라도 스위트가 완료된 후 파일이 올바르게 닫히는 이점이 있습니다. 또한 동등한 try-finally 블록을 작성하는 것보다 훨씬 짧습니다.
with내부 루프 를 중첩해야 할 때이 방법이 마음에 들지 않습니다 . 루프를 진행하면서 파일을 지속적으로 열고 닫습니다. 어쩌면 여기에 뭔가 빠졌 거나이 특정 시나리오에서 실제로 단점입니까?
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를 사용하지 마십시오!
os.linesepWindows에서 텍스트 모드로 명시 적으로 사용 하면 결과 \r\r\n가 잘못 된다는 것입니다. "Windows uses ..."는 의미가 없습니다. C 런타임 라이브러리 (따라서 파이썬) 번역 \n에 \r\n텍스트 모드에서 출력합니다. 다른 소프트웨어는 다르게 작동 할 수 있습니다. \n텍스트 모드에서 읽을 때 Windows에서 실행되는 모든 소프트웨어가 고독 을 줄 구분자로 인식하는 것은 아닙니다 . 파이썬은 그렇습니다. Microsoft의 메모장 텍스트 편집기는 그렇지 않습니다.
\r...
os.linesep 것은 "잘못"입니다. 그 것처럼 Department of Redundancy Department. 네 할 수 있습니다. 아니요, 원하지 않습니다.
나는 "올바른"방법이 없다고 생각합니다.
나는 사용할 것이다 :
with open ('myfile', 'a') as f: f.write ('hi there\n')
추모 팀 토디 .
with범위를 벗어나면 닫힙니다 .
open(..., 'a')또는 원할 수도 있습니다 'at'.
많은 양의 데이터를 작성하고 속도가 문제가된다면 아마도 함께 가야합니다 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니다.
Line이라고 말하면 '\ n'문자로 끝나는 직렬화 된 문자를 의미합니다. 줄은 어느 시점에서 마지막에 있어야하므로 각 줄 끝에서 '\ n'을 고려해야합니다. 해결책은 다음과 같습니다.
with open('YOURFILE.txt', 'a') as the_file:
the_file.write("Hello")
각 쓰기 후 추가 모드에서 커서를 새 줄로 이동합니다. w모드 를 사용 \n하려면 write()함수 끝에 문자를 추가해야 합니다.
the_file.write("Hello\n")
플라스크의 파일에 텍스트를 쓰려면 다음을 사용할 수 있습니다.
filehandle = open("text.txt", "w")
filebuffer = ["hi","welcome","yes yes welcome"]
filehandle.writelines(filebuffer)
filehandle.close()
시도해 볼 수도 있습니다 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__지원 되는 객체를 가져옵니다 .
새 줄을 많이 써야 할 때 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, 이것은보다 기능적이고 덜 암호적인 접근 방식입니다.
from functools import partial; fwl = partial(print, file=out).