2016-11-12 18 views
1

ファイルにデータを追加しようとしています。各行は関数内に記述されます。以下は、私の実際のコードに基づいて、サンプルコードは次のとおりです。Pythonでファイルの末尾にデータを追加する

a = 0 

def data(): 
    global a 
    a = int(raw_input('Enter value for a\n>')) 
    write() 

def write(): 
    f = open('path\\to\\file.txt', "a") 
    f.write('%s\n' % a) 
    f.close 
    proceed() 

def proceed(): 
    should = raw_input('Please press enter to continue or type in 0 to stop\n>') 
    if should == '0': 
     return 
    else: 
     data() 

data() 

私は例えば、1, 2 and 3はの値として、これはそれがファイルに書き込ま取得する方法で、コードを実行し、与える:

3 
2 
1 

しかし、私はそれをファイルにこの方法を書くことにしたい。

1 
2 
3 

それを行うための正しい方法でしょうか? write機能を実行するたびに、ファイルの最後に新しい行を追加するにはどうすればよいですか?

+1

'f.close'はファイルを閉じません!グローバルを使用してデータを渡すことは推奨されません。パラメータを使用します。そして、最終的に、私は本当になぜこの出力を得るのか分かりません。追加モードでは行の順序を元に戻すことはできませんが、意味がありません。 –

+0

@ Jean-FrançoisFabreありがとうございました。それは働くようになった。 – rsnaveen

+0

@ Jean-FrançoisFabreそれも私が理解できなかったことです。ファイルが閉じられていなくても、ファイルの末尾に常にデータを書き込んではいけませんか? – rsnaveen

答えて

2

あなたのプログラム構造は、おそらく非常に深い再帰(問題)を引き起こします。 data()ではwrite()を呼び出し、write()ではproceed()を呼び出し、proceed()でdata()を再度呼び出すためです。この種の構造を避けるようにしてください。次のコードは、この問題を回避し、短くなっています。

def data(): 
    while True: 
     a = int(raw_input('Enter value for a\n>')) 
     f.write(str(a) + '\n') 

     should = raw_input('Please press enter to continue or type in 0 to stop\n>') 
     if should == 0: 
      break 


f = open('path\\to\\file.txt', "a") 
data() 
f.close() 
+0

私が提供したサンプルコードは、実際のコードの構造を示すためのものです。入力を取得してファイルに書き込むためには、コードは優れています。しかし私の元のコードでは、私はかなりの機能を持っており、それぞれの機能が正常に動作するためには、前の機能がエラーなく実行されるべきです。だから私はこのように自分のコードを構造化したのです。しかし、ファイルが正常に閉じられなかったときと同じように追加動作がなぜ動作するのか説明できますか?ありがとうございました。 – rsnaveen

+0

実際のコードの構造により、再帰エラーが発生する可能性があります。これは、data()を再度呼び出す関数を呼び出す関数を呼び出すときにインタープリターがエラーをスローする前に、何度もdata()を呼び出すことができることを意味します。このチェーン内の通話は通訳によって追跡されなければならず、そのためには余裕があります。最終的に、あなたはスタックスペースを使い果たすつもりです - Stackoverflowへようこそ。私はあなたのファイルを適切に閉じないと、なぜ値がトップダウンで書かれたのかわかりません。 close()文の前にフラッシュされていないファイルバッファかもしれないと思います。 – Ukimiku

+0

ありがとう@Ukimiku。私は再帰エラーを避けるために私のプログラムを再構築しようとします:) – rsnaveen

1

@Ukimikuによって適切な要求が行われました。 あなたのコードがそのように動作する理由については、私の意見がここにあります。 実際には、open('path','a')でファイルを開くと、開いているファイルの末尾にファイルポインタが移動するので、write()を使用すると何かが追加されます。

f = open('path\\to\\file.txt', "a") 
print f.tell() #get the position of current file pointer 
f.write('%s\n' % a) 

あなたはfile.txtを開いた後print f.tell()を追加します。あなたがそれを開くたびに、ポインタの位置は常に0であり、これはあなたのwrite()操作がそれらの数字をそのファイルの先頭に挿入することを示します。これは閉鎖のせいで起こった。これらの変更はメモリ内で発生し、まだディスクに書き込まれていません。

+0

ありがとう – rsnaveen

関連する問題