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

2009年05月23日に質問されました。  ·  閲覧回数 1.7M回  ·  ソース

Josh Arenberg picture
2009年05月23日

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

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

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

回答

Alex Martelli picture
2009年05月23日
993

ループを使用できます:

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)-理由はありません文字列のリスト全体を具体化するために必要なすべてのメモリを使用します。

SingleNegationElimination picture
2009年05月23日
411

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

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

import pickle

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

読み返すには:

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)
osantana picture
2009年05月23日
312

より簡単な方法は次のとおりです。

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リストはメモリ内にある必要があるため、メモリ消費に注意してください。

orluke picture
2011年07月22日
100

Pythonの3Python 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文字列f"{item}\n"置き換えることができます。

Jason Baker picture
2009年05月23日
91

さらに別の方法。 simplejson (python 2.6にjsonとして含まれています)を使用してjsonに

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

output.txtを調べると:

[1、2、3、4]

構文はpythonicであり、人間が読める形式であり、他の言語の他のプログラムでも読むことができるため、これは便利です。

RobM picture
2011年02月18日
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の最大仮想メモリをulimit -v 102400最大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)

Big Sam picture
2017年08月11日
22

怠け者だから……

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())
themadmax picture
2015年11月18日
19

リストをコンマ区切り値のテキストファイルにシリアル化します

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )
Marvin W picture
2013年05月09日
16

一般に

以下は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

mtasic85 picture
2009年05月23日
13
file.write('\n'.join(list))