programing

write(write) 대 writeline(write string

starjava 2023. 7. 21. 20:26
반응형

write(write) 대 writeline(write string

그래서 파이썬을 배우고 있습니다.나는 수업을 받고 있는데 많은 것을 응축해야 하는 문제에 부딪혔습니다.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()?

파이썬 2.7

  • writelines상당한 문자열을 기대합니다.
  • write에서는 단일 문자열이 필요합니다.

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

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

write()에서는 새 줄에 문자열을 사용할 수 없지만 writeline()에서는 사용할 수 있는 이유는 무엇입니까?

아이디어는 다음과 같습니다. 만약 당신이 단일 문자열을 쓰고 싶다면 당신은 이것을 할 수 있습니다.write()일련의 문자열이 있는 경우 다음을 사용하여 모두 쓸 수 있습니다.writelines().

write(arg)문자열을 인수로 예상하고 파일에 씁니다.문자열 목록을 제공하면 예외가 발생합니다(참고로 오류 표시!).

writelines(arg)반복 가능한 인수(반복 가능한 개체는 일반적인 의미에서 튜플, 목록, 문자열 또는 반복자일 수 있음)를 예상합니다.반복기에 포함된 각 항목은 문자열이어야 합니다.줄의 튜플은 당신이 제공한 것이기 때문에 일이 잘 진행되었습니다.

문자열의 특성은 두 기능 모두에 중요하지 않습니다. 즉, 문자열은 사용자가 제공하는 모든 것을 파일에 기록합니다.흥미로운 부분은writelines()에서는 줄 바꿈 문자를 자체적으로 추가하지 않으므로 메소드 이름이 실제로 상당히 혼동될 수 있습니다.그것은 실제로 상상의 방법처럼 행동합니다.write_all_of_these_strings(sequence).

다음은 Python에서 각 문자열을 고유한 줄로 유지하면서 문자열 목록을 파일에 작성하는 관용적인 방법입니다.

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)

입력 파일을 한 줄씩 읽습니다.한 줄을 읽자마자 이 줄은 출력 파일에 기록됩니다.개략적으로 말하면, 메모리에는 항상 한 줄만 있습니다(읽기 줄/쓰기 줄 접근 방식의 경우 전체 파일 내용이 메모리에 있는 것과 비교).

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

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

작동해야 합니다.

제드 쇼의 책에서 16번 연습?다음과 같이 이스케이프 문자를 사용할 수 있습니다.

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

목록을 저장하고 로드하려면 피클을 사용해 보십시오.

피클 저장:

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

로드:

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

언급URL : https://stackoverflow.com/questions/12377473/write-versus-writelines-and-concatenated-strings

반응형