[python] 파이썬으로 파일에리스트 쓰기

writelines()개행 문자를 삽입하지 않기 때문에 파일에 목록을 작성하는 가장 깨끗한 방법 입니까?

file.writelines(["%s\n" % item  for item in list])

표준 방법이있을 것 같습니다 …



답변

루프를 사용할 수 있습니다 :

with open('your_file.txt', 'w') as f:
    for item in my_list:
        f.write("%s\n" % item)

Python 2에서는 다음을 사용할 수도 있습니다.

with open('your_file.txt', 'w') as f:
    for item in my_list:
        print >> f, item

단일 함수 호출에 관심이 있다면 적어도 대괄호를 제거하여 []인쇄 할 문자열이 한 번에 하나씩 생성되도록하십시오 (목록 작성이 아닌 genexp)-필요한 모든 메모리를 차지할 이유가 없습니다. 전체 문자열 목록을 구체화합니다.


답변

파일로 무엇을 하시겠습니까? 이 파일이 사람이나 명확한 상호 운용성 요구 사항을 가진 다른 프로그램에 존재합니까?

동일한 파이썬 앱에서 나중에 사용하기 위해 목록을 디스크로 직렬화하려고하면 목록을 피클 링 해야합니다.

import pickle

with open('outfile', 'wb') as fp:
    pickle.dump(itemlist, fp)

다시 읽으려면 :

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)


답변

가장 간단한 방법은 다음과 같습니다.

with open("outfile", "w") as outfile:
    outfile.write("\n".join(itemlist))

생성기 표현식을 사용하여 항목 목록의 모든 항목이 문자열인지 확인할 수 있습니다.

with open("outfile", "w") as outfile:
    outfile.write("\n".join(str(item) for item in itemlist))

모든 itemlist목록은 메모리에 있어야하므로 메모리 소비에주의하십시오.


답변

사용 파이썬 3파이썬 2.6+ 구문 :

with open(filepath, 'w') as file_handler:
    for item in the_list:
        file_handler.write("{}\n".format(item))

이것은 플랫폼에 독립적입니다. 또한 줄 바꿈 문자로 최종 행을 종료하는데, 이는 UNIX 모범 사례 입니다.

Python 3.6부터는 "{}\n".format(item)f-string :으로 바꿀 수 있습니다 f"{item}\n".


답변

또 다른 방법. simplejson을 사용하여 json으로 직렬화하십시오 ( python 2.6에서 json 으로 포함 ).

>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()

output.txt를 검사하는 경우 :

[1, 2, 3, 4]

구문은 pythonic이고 사람이 읽을 수 있으며 다른 언어로 된 다른 프로그램에서 읽을 수 있기 때문에 유용합니다.


답변

genexp 사용의 이점을 살펴 보는 것이 흥미로울 것이라고 생각했습니다.

질문의 예는 대괄호를 사용하여 임시 목록을 작성하므로 다음과 같습니다.

file.writelines( list( "%s\n" % item for item in list ) )

쓸 줄이없는 모든 행의 임시 목록을 불필요하게 구성하는 것은 목록의 크기와 출력의 정도에 따라 상당한 양의 메모리를 소비 할 수 있습니다 str(item).

대괄호를 삭제하면 ( list()위 의 래핑 호출 을 제거하는 것과 동일 ) 임시 생성기file.writelines()다음 으로 전달합니다 .

file.writelines( "%s\n" % item for item in list )

이 생성기는 item필요할 때 (즉, 작성된대로) 객체 의 개행 종료 표현을 생성합니다 . 이것은 몇 가지 이유로 좋습니다.

  • 매우 큰 목록에서도 메모리 오버 헤드가 적습니다.
  • 경우 str(item)느린 각 항목이 처리 될 때 파일에 표시 진전이있다

이렇게하면 다음과 같은 메모리 문제가 발생하지 않습니다.

In [1]: import os

In [2]: f = file(os.devnull, "w")

In [3]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 385 ms per loop

In [4]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.

Traceback (most recent call last):
...
MemoryError

(로 Python의 최대 가상 메모리를 ~ 100MB로 제한 하여이 오류를 유발했습니다 ulimit -v 102400).

메모리 사용량을 한쪽에두면이 방법은 실제로 원래보다 빠르지 않습니다.

In [4]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 370 ms per loop

In [5]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
1 loops, best of 3: 360 ms per loop

(Linux의 Python 2.6.2)


답변

내가 게 으르니까 ….

import json
a = [1,2,3]
with open('test.txt', 'w') as f:
    f.write(json.dumps(a))

#Now read the file back into a Python list object
with open('test.txt', 'r') as f:
    a = json.loads(f.read())