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


답변

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

피클 저장 :

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

및로드 :

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


답변

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

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

작동합니다.


답변

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

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


답변