web-dev-qa-db-ja.com

Pythonでファイルにリストを書く

writelines()は改行文字を挿入しないので、これはリストをファイルに書き込む最もきれいな方法ですか?

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

標準的な方法があるようです...

510
Josh Arenberg

あなたはループを使用することができます:

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

単一の関数呼び出しに興味がある場合は、少なくとも括弧[]を削除して、印刷される文字列が1つずつ作成されるようにします(listcompではなくgenexp) - すべてのメモリを占有する理由はありません。文字列のリスト全体を具体化するために必要です。

701
Alex Martelli

ファイルをどうするつもりですか?このファイルは人間のために存在しますか、または明白な相互運用性要件を持つ他のプログラムのために存在しますか?

同じPythonアプリケーションで後で使用するためにリストをディスクにシリアル化しようとしているだけの場合は、 pickleing リストにする必要があります。

import pickle

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

読み返すには:

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

最善の方法は次のとおりです。

outfile.write("\n".join(itemlist))
226
osantana

また別の方法です。 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であり、人間が読める形式であり、他の言語の他のプログラムから読み取ることができるので、これは便利です。

84
Jason Baker

Python 3 および Python 2.6+ の構文を使用する:

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

これはプラットフォームに依存しません。また、 UNIXのベストプラクティス である、改行文字で最後の行を終了します。

81
orluke

私はgenexpを使うことの利点を探るのは面白いだろうと思ったので、ここに私の考えがあります。

この例では、角括弧を使用して一時的なリストを作成しています。そのため、次のようになります。

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

これは不必要に書き出されるすべての行の一時的なリストを作成します、これはあなたのリストのサイズとstr(item)の出力がどの程度冗長であるかによってかなりの量のメモリを消費するかもしれません。

角括弧を削除すると(上のラッピングlist()呼び出しを削除するのと同じ)、代わりに一時的な generatorfile.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

(私はulimit -v 102400を使ってPythonの最大仮想メモリを最大100MBに制限することでこのエラーを引き起こしました).

メモリ使用量を片側に置くと、この方法は実際には元の速度より速くはありません。

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)

36
RobM

リストをカンマ区切り値でテキストファイルにシリアル化

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

私は怠け者だから....

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

一般に

以下は writelines() methodの構文です。

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

14
Marvin W
file.write('\n'.join(list))
12
mtasic85
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")
8
shankar

次のようにpython3を使っているなら、print関数を使うこともできます。

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

試してみませんか

file.write(str(list))
3
Bob

このロジックはまずlist内の項目をstring(str)に変換します。時々リストはのようなタプルを含んでいます

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

このロジックは各タプルを新しい行にファイルするように書き込みます。ファイルを読み込むときに各Tupleをロードするときに、後で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 
2
Tahir Ahmad

改行を繰り返し追加するもう一つの方法:

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