나는 익숙해 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.linesep
Windows에서 텍스트 모드로 명시 적으로 사용 하면 결과 \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)
.