2013-06-20 16 views
32

これは少し奇妙な要求ですが、私はリストをファイルに書き込んでから別の時間に読み返す方法を探しています。Python 2.7 - ファイルからのリストの書き込みと読み取り

以下の例に示すように、リストが正しく形成/フォーマットされるようにリストをリメイクする方法はありません。

私のリストには、次のようなデータを持っている:

test 
data 
here 
this 
is one 
group :) 

test 
data 
here 
this 
is another 
group :) 

答えて

92

あなたは人間が読める/編集可能にそれを必要としない場合は、最も簡単な解決策はただpickleを使用することです。

with open(the_filename, 'wb') as f: 
    pickle.dump(my_list, f) 

を読むには:書き込むに

with open(the_filename, 'rb') as f: 
    my_list = pickle.load(f) 

をあなたがを行う場合は、我々はより多くの情報が必要、彼らは人間が読めるようにする必要があります。

my_listがちょうどそれらを1行に1つずつ書き、埋め込まれていない改行と文字列のリストであることが保証されている場合:あなた'LL、彼らは、Unicode文字列ではなく、バイト文字列なら

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write(s + '\n') 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip('\n') for line in f] 

encodeにします。 (あるいは、バイト文字列であればシステムのデフォルトと同じエンコーディングである必要はありません)

改行や印刷できない文字などがある場合は、エスケープやクォート。 Pythonにはstdlibに組み込まれているさまざまな種類のエスケープがあります。

のは、一度に上記の問題の両方を解決するために、ここでunicode-escapeを使用してみましょう:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write((s + u'\n').encode('unicode-escape')) 

with open(the_filename, 'r') as f: 
    my_list = [line.decode('unicode-escape').rstrip(u'\n') for line in f] 

あなたはまた、いずれかのcodecsモジュールまたはで、2.xで3.xのスタイルのソリューションを使用することができますioモジュール:*

import io 

with io.open(the_filename, 'w', encoding='unicode-escape') as f: 
    f.writelines(line + u'\n' for line in my_list) 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip(u'\n') for line in f] 

* TOOWTDIので、これは1つの明白な方法は何ですか?それは依存します...短いバージョンの場合:2.6より前のバージョンのPythonで作業する必要がある場合は、codecsを使用します。そうでない場合は、ioを使用します。

+0

私はピクルスライブラリーが好きです。それはかなり甘く、完璧に機能します。私はすでにそれを実装しており、それは大丈夫に動作しているようです。 ありがとうございました。すぐに私はあなたに緑のダニとしてマークします。 – Ryflex

+0

unicode-escape ... TypeErrorのために 'wb'として開く必要がありました。バイトではなくstrでなければなりません。 – rluks

+0

@ Pan.student:Python 3.xを使用していますか?この質問が尋ねたPython 2では、 'str'と' bytes'は同じ型です。バイナリファイルとテキストファイルの違いは単なる改行です。 Python 3では、 'str'と' unicode'は同じ型です。バイナリファイルとテキストファイルの違いは、テキストファイルが自動的にエンコードしてデコードすることです。 ( 'io.open'で3.x形式のテキストファイルを含めて、注意深い場合は2.xなら3.xのような動作をすることができますが、質問者はそれをしていませんでした) – abarnert

12

限り、あなたのファイルは、一貫性のあるフォーマット(すなわち改行を)持っているとして、これは単に基本的なファイルIOと文字列操作で簡単です:

with open('my_file.txt', 'rU') as in_file: 
    data = in_file.read().split('\n') 

項目のリストとしてあなたのデータファイルを保存します、1行に1つ。それをファイルに入れるには、逆の作業を行います。

with open('new_file.txt', 'w') as out_file: 
    out_file.write('\n'.join(data)) # This will create a string with all of the items in data separated by new-line characters 

お探しの情報に間違いありません。

+0

+1。私たちが話している 'data'が複雑ではない場合、IMHOでは、このansのように独自のパーサーを動かす方が良いです。 – brokenfoot

関連する問題