Pythonでファイルにリストを書き込む


672

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

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

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


37
writelinesミラーリングしているため改行が追加されreadlinesず、削除もされないことに注意してください。
SingleNegationElimination 2011

回答:


908

ループを使用できます。

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


7
これはそれほど複雑ではありませんが、シリアル化と逆シリアル化について心配する必要がないように、ピクルスまたはjsonを使用しないのはなぜですか?
Jason Baker、

82
たとえば、1行に1項目の出力テキストファイルを簡単に読み取ったり、編集したりできるようにするためです。ほとんどまれな欲求;-)。
Alex Martelli、

1
最初の\ nはPython 2.7 / Windowsでは冗長であることがわかりました
Jorge Rodriguez

11
これにより、最後に余分な改行文字が書き込まれます...ループではなく、次のように書くことができますthefile.write('\n'.join(thelist))
Tgsmith61591

3
「リストのデータ型に注意してください」と付け加えます。私はいくつかの奇妙な結果を得ていました、おそらくこれは誰かを助けることができます:thefile.write(str(item) + "\n")
iipr

383

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

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

import pickle

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

それを読み返すには:

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

35
+1-Pythonにシリアル化が組み込まれているのに、なぜ車輪を再発明するのですか?
Jason Baker、

20
1 - OUTFILEのようなものです:open( "save.p", "wb" ) INFILEのようなものです:open( "save.p", "rb" )
xxjjnn

2
問題は、リストがメモリに収まる必要があることです。これが当てはまらない場合は、行ごとが実際に可能な戦略です(または、stackoverflow.com / questions / 7180212 /…のような代替案を使用すること)
Filippo Mazza

1
:Pythonの2の使用の代わりに「RB」の「R」漬物を読んだときに、「安全でない文字列の漬物をValueErrorを」取得する場合には
queise

1
@serafeim:いいえ。with:ブロックは、ブロック外の次のステートメントに進む前にファイルを閉じますwith
SingleNegationElimination

285

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

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
末尾の改行はなく、ループと比較して2倍のスペースを使用します。
デイブ

7
もちろん、最初に頭に浮かぶのは、OPが改行で終了する必要があるかどうか、およびスペースの量が重要かどうかです。あなたは彼らが時期尚早な最適化について言うことを知っています。
Jason Baker、

15
欠点:これは、ファイルの内容全体をメモリに構築してからそれらを書き出すため、ピーク時のメモリ使用量が高くなる可能性があります。
RobM、2011

4
これを機能させることはできません。次のエラーが表示されます:「text = '\ n'.join(namelist)+' \ n 'TypeError:シーケンスアイテム0:予期される文字列、リストが見つかりました」
Dan

2
'namelist'のすべての要素が文字列であることを確認する必要があります。
osantana 2011

94

使用してPythonの3のPython 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」を追加したくないのですが、どうすればよいですか?if条件が欲しくない
pyd

4
@pyd forループを次のものに置き換えますfile_handler.write("\n".join(str(item) for item in the_list))
orluke

88

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


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

リストはシリアル化可能ですか?
kRazzy R 2018

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")。問題は、プログラムが3回実行され、3つの実行の結果がマッシュアップされていることです。各実行の結果を識別できるように、1〜2個の空の行を追加する方法はありますか?
kRazzy R 2018

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




7

次のようにpython3を使用している場合は、print関数も使用できます。

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

myfile.txtに次のような1行だけを追加するのではないですか?['a'、 'b'、 'c']各行にそれぞれa、b、cを書き込むのではありません。
Harry Duong 2017年


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

0

python> 3では、引数の解凍にprintand *を使用できます。

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

-2

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

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

-3

avgをリストにすると、次のようになります。

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

要件に応じて、%eまたは使用することができ%sます。


-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

仕組み:最初に、組み込みのopen関数を使用して、ファイルの名前とファイルを開くモードを指定してファイルを開きます。モードは、読み取りモード( 'r')、書き込みモード( 'w')、または追加モード( 'a')のいずれかです。また、テキストモード( 't')またはバイナリモード( 'b')のどちらで読み取り、書き込み、または追加するかを指定することもできます。実際にはより多くのモードが利用可能であり、help(open)はそれらについてより多くの詳細を提供します。デフォルトでは、open()はファイルを「t」extファイルと見なし、「r」eadモードで開きます。この例では、まずファイルをテキスト書き込みモードで開き、ファイルオブジェクトのwriteメソッドを使用してファイルに書き込み、次にファイルを閉じます。

上記の例は、Swaroop C Hによる本「A Byte of Python」からのものです 。swaroopch.com


5
これは、OPが要求するような(文字列の)リストではなく、ファイルに文字列を書き込みます
gwideman '24
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.