python 파일 파이썬 쓰기() 대 쓰기() 및 연결된 문자열




파이썬 파일 읽기 배열 (4)

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

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

그래서 저는 파이썬을 배우고 있습니다. 나는 교훈을 겪고 각 사용자 입력 변수 ( write() 객체) 사이에 "\n" 을 갖는 동시에 많은 target.write() 를 하나의 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 ()에서 개행 문자를 사용할 수없는 이유는 무엇입니까?하지만 메모 라인 ()에서 사용할 수 있습니까?

아이디어는 다음과 같습니다 : 단일 문자열을 쓰고 싶다면 write() 됩니다. 일련의 문자열이 있다면 writelines() 사용하여 문자열을 모두 쓸 수 있습니다.

write(arg) 는 문자열을 인수로 기대하고 파일에 씁니다. 문자열 목록을 제공하면 예외가 발생합니다 (그런데 오류를 보여줍니다!).

writelines(arg) 는 iterable을 인수로 기대합니다 (iterable 객체는 가장 일반적인 의미에서 튜플, 목록, 문자열 또는 반복자가 될 수 있음). 이터레이터에 포함 된 각 항목은 문자열이어야합니다. 문자열의 튜플 (tuple)은 사용자가 제공 한 것입니다.

문자열의 특성은 두 기능 모두에 중요하지 않습니다. 즉, 사용자가 제공 한 문자열을 파일에 씁니다. 재미있는 부분은 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 '을 글루 (glue)로 사용합니다. + 연산자를 사용할 때보 다 효율적입니다.

동일한 lines 시퀀스에서 시작하여 동일한 출력으로 writelines() .

lines = ['line1', 'line2']
with open('filename.txt', 'w') as f:
    f.writelines("%s\n" % l for l in lines)

이것은 생성자 표현식을 사용하고 개행 문자로 끝나는 문자열을 동적으로 생성합니다. writelines() 는이 문자열 시퀀스를 반복하고 모든 항목을 씁니다.

편집 : 당신이 알고 있어야 다른 지점 :

writelines() 가 도입되기 전에 write()readlines() 있었습니다. 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)




python-2.x