write ()에서 줄 바꿈에 문자열을 사용할 수 없지만 writelines ()에서 사용할 수있는 이유는 무엇입니까?
아이디어는 다음과 같습니다. 단일 문자열을 작성하려면 write()
. 일련의 문자열이 있으면 다음을 사용하여 모두 쓸 수 있습니다.writelines()
.
write(arg)
인수로 문자열을 예상하고 파일에 씁니다. 문자열 목록을 제공하면 예외가 발생합니다 (그런데 오류를 표시합니다!).
writelines(arg)
이터 러블을 인수로 예상합니다 (이터 러블 객체는 가장 일반적인 의미에서 튜플, 목록, 문자열 또는 반복자가 될 수 있습니다). 반복기에 포함 된 각 항목은 문자열이어야합니다. 문자열 튜플이 제공되었으므로 모든 것이 작동했습니다.
문자열의 특성은 두 함수 모두에 중요하지 않습니다. 즉, 사용자가 제공하는 파일에 기록합니다. 흥미로운 부분은 writelines()
자체적으로 개행 문자를 추가하지 않기 때문에 메서드 이름이 실제로 매우 혼란 스러울 수 있다는 것입니다. 실제로라는 가상의 방법처럼 작동 write_all_of_these_strings(sequence)
합니다.
다음은 파이썬에서 각 문자열을 자체 줄에 유지하면서 문자열 목록을 파일에 쓰는 관용적 방법입니다.
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.write('\n'.join(lines))
이렇게하면 파일이 닫힙니다. 이 구성 '\n'.join(lines)
은 목록의 문자열을 연결 (연결) lines
하고 문자 '\ n'을 접착제로 사용합니다. +
연산자를 사용하는 것보다 더 효율적 입니다.
동일한 lines
시퀀스 에서 시작 하여 동일한 출력으로 끝나지만 다음을 사용합니다 writelines()
.
lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)
이것은 생성기 표현식을 사용하고 개행으로 끝나는 문자열을 동적으로 생성합니다. writelines()
이 문자열 시퀀스를 반복하고 모든 항목을 씁니다.
편집 : 알아야 할 또 다른 사항 :
write()
그리고 readlines()
전에 존재 writelines()
도입되었다. writelines()
나중에를 readlines()
통해 읽은 파일 내용을 쉽게 작성할 수 있도록 의 대응으로 나중에 소개되었습니다 readlines()
.
outfile.writelines(infile.readlines())
writelines
이름이 그렇게 헷갈리는 주된 이유가 바로 이것이다 . 또한 오늘날 우리는 더 이상이 방법을 사용하고 싶지 않습니다. 데이터 쓰기 readlines()
를 writelines()
시작하기 전에 전체 파일을 컴퓨터의 메모리로 읽습니다 . 우선, 이것은 시간을 낭비 할 수 있습니다. 다른 부분을 읽는 동안 데이터의 일부를 쓰기 시작하지 않겠습니까? 그러나 가장 중요한 것은이 접근 방식이 메모리를 많이 소비 할 수 있다는 것입니다. 입력 파일이 컴퓨터의 메모리보다 큰 극단적 인 시나리오에서는이 방법이 작동하지 않습니다. 이 문제에 대한 해결책은 반복자 만 사용하는 것입니다. 실제 예 :
with open('inputfile') as infile:
with open('outputfile') as outfile:
for line in infile:
outfile.write(line)
입력 파일을 한 줄씩 읽습니다. 한 줄을 읽는 즉시이 줄이 출력 파일에 기록됩니다. 개략적으로 말하면 메모리에는 항상 한 줄만 있습니다 (readlines / writelines 접근 방식의 경우 메모리에있는 전체 파일 내용과 비교).
lines
귀하의 예에서 문자열이 아닙니다. 6 개의 문자열로 구성된 튜플입니다.