2016-07-17 2 views
0

エントリとオブジェクトに関するいくつかの文字列情報をファイルに保存したい(タイプに気をつけない)。私は自分のデータから文字列を生成することができ、文字列を.txtファイルに保存する方法を知っています。しかし、私がファイルから読み込んでいるとき、私は "行"を読んでいるので、最初の改行記号まで行を読み込んでいると仮定しています。しかし、私の文字列の中にはドキュメント行よりも長いものがあり、読みたいときにエラーが出ます。どのようにデータを失わないようにファイルに長い文字列を保存することができますか?Python:ファイルの大きなエントリを保存する

それは私がファイルに保存していますか、次のとおりです。

with codecs.open(filename, 'a', "utf-8") as outfile: 
    outfile.write(data_string + '\n') 

とどのように私は、ファイルからデータを読み込む:

with codecs.open(filename, 'r',"utf-8") as infile: 
    lines = infile.readlines() 
+0

あなたが表示したコードでデータを失うことはありません。おそらく何らかの事例データや再現可能な完全なプログラムがなければ何が間違っているのかははっきりしない。 –

+0

私がテストできるように保存できない文字列の長さについて言及すると面白いでしょう。 –

答えて

1

あなたは、いくつかのオプションがあります。

ダンプ/ロード:JSON

import tempfile 
import json 

text = 'this is my string with a \nnewline in it' 

with tempfile.TemporaryFile(mode='w+') as f: 
    f.write(json.dumps([text])) 
    f.flush() 
    f.seek(0) 
    lines = json.load(f) 
    print(lines) 

不利な点:JSONはかなり人間が読めるかもしれませんが、あなたのファイルに少し間違いがあると、すべてがうまくいきます。それほど読みにくいテキストではない。

漬物

import tempfile 
import pickle 

text = 'this is my string with a \nnewline in it' 

with tempfile.TemporaryFile(mode='w+') as f: 
    f.write(pickle.dumps([text])) 
    f.flush() 
    f.seek(0) 
    lines = pickle.load(f) 
    print(lines) 

マイナス面:漬物はterribly insecureであり、あなたはかなりあなたがevalを同じように扱う必要があります。その状況でevalを使用するのが快適でない場合は、pickleを使用しないでください。

あなた自身sentinel

import tempfile 

text = 'this is my string with a \nnewline in it' 
other_text = 'this line has no newline in it' 

with tempfile.TemporaryFile(mode='w+') as f: 
    f.write(text) 
    f.write(chr(30)) 
    f.write(other_text) 
    f.flush() 
    f.seek(0) 
    lines = f.read().split(chr(30)) 
    print(lines) 

欠点が:少しトリッキーだろう。テキスト自体にあなたのセンチネルが見つからないようにする必要があります。また、readlinesを使用することはできません。また、行ごとに反復処理を行うのは少し厄介です。

関連する問題