IT박스

Python-write () 대 writelines () 및 연결된 문자열

itboxs 2020. 8. 7. 08:09
반응형

Python-write () 대 writelines () 및 연결된 문자열


그래서 저는 파이썬을 배우고 있습니다. 레슨을 진행 중이며 각 사용자 입력 변수 (의 개체 ) 사이에 있는 동안 많은 수 target.write()를 단일으로 압축 write()해야하는 문제가 "\n"발생했습니다 write().

나는 생각해 냈다 :

nl = "\n"
lines = line1, nl, line2, nl, line3, nl
textdoc.writelines(lines)

내가하려고하면 :

textdoc.write(lines)

오류가 발생합니다. 하지만 입력하면 :

textdoc.write(line1 + "\n" + line2 + ....)

그런 다음 잘 작동합니다. 줄 바꿈에 문자열을 사용할 수 없지만에서 사용할 수있는 이유 write()writelines()무엇입니까?

Python 2.7 Google을 검색했을 때 내가 찾은 대부분의 리소스는 내 머리 위에 있었지만 여전히 평신도입니다.


  • writelines 반복 가능한 문자열이 필요합니다.
  • write 단일 문자열이 필요합니다.

line1 + "\n" + line2에 전달하기 전에 이러한 문자열을 단일 문자열로 병합합니다 write.

줄이 많은 경우를 사용할 수 있습니다 "\n".join(list_of_lines).


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 접근 방식의 경우 메모리에있는 전체 파일 내용과 비교).


사실 문제는 변수 "라인"이 나쁘다는 것입니다. 라인을 튜플로 정의했지만 write ()에는 문자열이 필요하다고 생각합니다. 쉼표를 플러스 (+)로 바꾸면됩니다.

nl = "\n"
lines = line1+nl+line2+nl+line3+nl
textdoc.writelines(lines)

작동해야합니다.


목록을 저장하고로드하려면 Pickle을 사용 해보세요.

피클 저장 :

with open("yourFile","wb")as file:
 pickle.dump(YourList,file)

및로드 :

with open("yourFile","rb")as file:
 YourList=pickle.load(file)

Zed Shaw의 책에서 운동 16? 다음과 같이 이스케이프 문자를 사용할 수 있습니다.

paragraph1 = "%s \n %s \n %s \n" % (line1, line2, line3)
target.write(paragraph1)
target.close()

참고 URL : https://stackoverflow.com/questions/12377473/python-write-versus-writelines-and-concatenated-strings

반응형