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


674

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

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

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


37
주의 할 writelines것이 있기 때문에 거울 줄 바꿈을 추가하지 않습니다 readlines또한 그들을 제거하지 않습니다.
SingleNegationElimination 4

답변:


911

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

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)-필요한 모든 메모리를 차지할 이유가 없습니다. 전체 문자열 목록을 구체화합니다.


7
이것은 매우 복잡하지는 않지만 직렬화 및 역 직렬화에 대해 걱정할 필요가 없도록 pickle 또는 json을 사용하지 않는 이유는 무엇입니까?
Jason Baker

82
예를 들어 한 줄에 한 항목 씩 쉽게 읽고 편집 할 수있는 출력 텍스트 파일을 원하기 때문입니다. 드문 욕망 ;-).
Alex Martelli

1
내가 발견 \ n 처음에 중복 파이썬 2.7에 있던 / 윈도우이
호르헤 로드리게스

11
이 ... 마지막에 여분의 줄 바꿈 문자를 쓸 것보다는 루프보다, 그냥 쓸 수thefile.write('\n'.join(thelist))
Tgsmith61591

3
"목록 데이터 유형에주의하십시오"를 추가합니다. 나는 이상한 결과를 얻었습니다. 아마도 이것은 누군가를 도울 수 있습니다.thefile.write(str(item) + "\n")
iipr

383

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

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

import pickle

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

다시 읽으려면 :

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

35
+1-파이썬에 직렬화가 내장되어 있는데 왜 휠을 재발 명합니까?
Jason Baker

20
+1-outfile은 다음과 같습니다 : open( "save.p", "wb" ) infile은 다음과 같습니다 :open( "save.p", "rb" )
xxjjnn

2
문제는 목록이 메모리에 맞아야한다는 것입니다. 그렇지 않은 경우 한 줄씩 가능한 전략 일 수 있습니다 (또는 stackoverflow.com/questions/7180212/… 에서와 같은 대안으로 진행 )
Filippo Mazza

1
: 파이썬이 사용하는 대신 'RB'의 'R'피클을 읽을 때 당신이 "안전하지 않은 문자열 피클을 ValueError를"얻는 경우에
queise

1
@ 세라 페임 : 아니오; with:블록의 다음 문 밖으로 계속하기 전에 파일을 닫습니다 with블록.
SingleNegationElimination

286

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

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목록은 메모리에 있어야하므로 메모리 소비에주의하십시오.


23
후행 줄 바꿈이 없으며 루프와 비교하여 2x 공간을 사용합니다.
Dave

7
당연히 떠오르는 첫 번째 질문은 OP가 개행으로 끝나야하는지 여부와 공간의 양이 중요한지 여부입니다. 조기 최적화에 대한 의견을 알고 있습니다.
Jason Baker

15
단점 : 파일을 쓰기 전에 메모리에 파일의 전체 내용을 구성하므로 최대 메모리 사용량이 높을 수 있습니다.
RobM

4
나는 이것을 작동시킬 수 없다. 이 오류가 발생합니다 : "text = '\ n'.join (namelist) +'\ n 'TypeError : 시퀀스 항목 0 : 예상 문자열, 목록을 찾았습니다"
Dan

2
'namelist'의 모든 요소가 문자열인지 확인해야합니다.
osantana

94

사용 파이썬 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".


마지막 항목에 "\ n"을 추가하고 싶지 않습니다. 어떻게해야합니까? 조건을 원하지 않는 경우
pyd

4
@pyd for 루프를file_handler.write("\n".join(str(item) for item in the_list))
orluke

88

또 다른 방법. 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이고 사람이 읽을 수 있으며 다른 언어로 된 다른 프로그램에서 읽을 수 있기 때문에 유용합니다.


39

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)


20

내가 게 으르니까 ....

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())

json 직렬화 가능 목록입니까?
kRazzy R

1
그렇습니다.
CommandoScorch

1
수입 json; test_list = [1,2,3]; list_as_a_string = json.dumps (test_list); #list_as_a_string은 이제 문자열 '[1,2,3]'입니다
CommandoScorch

나는 이것을하고있다 with open ('Sp1.txt', 'a') as outfile: json.dump (sp1_segments, outfile) logger.info ("Saved sp_1 segments"); 문제는 내 프로그램이 세 번 실행되고 세 번의 실행 결과가 손상되는 것입니다. 각 실행의 결과를 식별 할 수 있도록 1-2 개의 빈 줄을 추가하는 방법이 있습니까?
kRazzy R

1
물론! 대신 할 수 json.dump(sp1_segments + "\n\n", outfile)있습니까?
CommandoScorch

19

쉼표로 구분 된 값을 사용하여 목록을 텍스트 파일로 직렬화

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )

14

일반적으로

다음은 writelines () 메소드 의 구문입니다.

fileObject.writelines( sequence )

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "rw+")
seq = ["This is 6th line\n", "This is 7th line"]

# Write sequence of lines at the end of the file.
line = fo.writelines( seq )

# Close opend file
fo.close()

참고

http://www.tutorialspoint.com/python/file_writelines.htm



8
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")

7

다음과 같이 python3을 사용하는 경우 인쇄 기능을 사용할 수도 있습니다.

f = open("myfile.txt","wb")
print(mylist, file=f)

myfile.txt에 한 줄만 넣지는 않습니까? 각 줄에 a, b, c를 쓰는 대신 [ 'a', 'b', 'c']와 같이 입력하십시오.
Harry Duong


2

이 논리는 먼저 목록의 항목을로 변환합니다 string(str). 때로는 목록에 다음과 같은 튜플이 포함됩니다

alist = [(i12,tiger), 
(113,lion)]

이 논리는 각 튜플을 새로운 줄에 기록합니다. 나중에 eval파일을 읽을 때 각 튜플을로드 하는 동안 사용할 수 있습니다 .

outfile = open('outfile.txt', 'w') # open a file in write mode
for item in list_to_persistence:    # iterate over the list items
   outfile.write(str(item) + '\n') # write to the file
outfile.close()   # close the file 

1

개행을 반복하고 추가하는 또 다른 방법 :

for item in items:
    filewriter.write(f"{item}" + "\n")

1

파이썬> 3에서는 사용할 수 있습니다 print*풀고 인수에 대해 :

with open("fout.txt", "w") as fout:
    print(*my_list, sep="\n", file=fout)

-2

avg를 목록으로 보자.

In [29]: a = n.array((avg))
In [31]: a.tofile('avgpoints.dat',sep='\n',dtype = '%f')

필요에 따라 사용 %e하거나 사용할 수 있습니다 %s.


-2

Python3 에서는 이 루프를 사용할 수 있습니다

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

-4
poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''
f = open('poem.txt', 'w') # open for 'w'riting
f.write(poem) # write text to file
f.close() # close the file

작동 방식 : 먼저 내장 된 열기 기능을 사용하고 파일 이름과 파일을 열 모드를 지정하여 파일을 엽니 다. 모드는 읽기 모드 ( 'r'), 쓰기 모드 ( 'w') 또는 추가 모드 ( 'a') 일 수 있습니다. 텍스트 모드 ( 't') 또는 이진 모드 ( 'b')에서 읽고 쓰거나 추가 할 것인지 지정할 수도 있습니다. 실제로 더 많은 모드를 사용할 수 있으며 help (open)는 해당 모드에 대한 자세한 정보를 제공합니다. 기본적으로 open ()은 파일을 't'extfile로 간주하여'r'ead 모드에서 엽니 다. 이 예에서는 먼저 텍스트 쓰기 모드에서 파일을 열고 파일 객체의 쓰기 방법을 사용하여 파일에 쓴 다음 파일을 닫습니다.

위의 예는 Swaroop C H.의 "A Byte of Python"책에서 발췌 한 것입니다 . swaroopch.com


5
이는 영업 이익은 요청대로 아니라 파일 (문자열) 목록에 문자열을 기록
gwideman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.