2012-04-18 7 views
2

を失敗している私のコードです:チェックはここで

# header.py 

def add_header(filename): 
    header = '"""\nName of Project"""' 
    try: 
     f = open(filename, 'w') 
    except IOError: 
     print "Sorry could not open file, please check path" 
    else: 
     with f: 
      f.seek(0,0) 
      f.write(header) 
     print "Header added to", filename 

if __name__ == "__main__": 
    filename = raw_input("Please provide path to file: ") 
    add_header(filename) 

私はそれがない存在しないファイル名を提供した場合であっても、(Pythonのheader.pyを行うことによって)このスクリプトを実行すると、関数内のメッセージを返します。 print文をreturn文で置き換えても何も返されません。どのように機能にメッセージを表示するのですか?

+11

いつも 'w'でファイルを作成しているようですね。 – octopusgrabbus

+0

@octopusgrabbusあなたはそれを答えに変えたいと思うかもしれません。 –

+1

私のために働く。「メッセージを返さない」というのはどういう意味ですか? – geoffspear

答えて

2

これはLattywaresソリューションのわずかに変更されたバージョンです。ファイルの先頭にデータを追加することはできないため、コンテンツ全体が読み込まれ、ヘッダを含めてファイルが新たに書き込まれます。ファイルを読み取り/書き込みモードで開くと、同じファイルハンドラで解放することなく両方の操作を行うことができます。これは、競争条件に対して何らかの保護を提供するはずです。

try: 
    with open(filename, 'r+') as f: 
     data = f.read() 
     f.seek(0,0) 
     f.write(header) 
     f.write(data) 
     #f.truncate() is not needed here as the file will always grow 
    print("Header added to", filename) 
except IOError: 
    print("Sorry, could not open file for reading/writing") 
+1

+1 - これは私より優れた解決策です。私は '' r + ''がファイルを作成しないことを知りませんでした。この方法には、ファイル全体を読み込む必要がないというメリットがあります(大きなファイルで多くのメモリを使用する可能性があります)。 –

+0

私は実際これをあなたのソリューションにコメントとして追加したいと思っていましたが、明らかにまだ許可されていません;) – pwuertz

+0

別の回答として投稿することは正しいことです。それに対する信用。 –

3

私はいつもファイルを作成していると思います。したがって、例外がないファイルは表示されません。あなたがファイルを作成する特権を持たないかもしれないので、tryを除いてwriteまたはfile open writeを置くことを傷つけることはありません。

私はtry exceptとelseのような文でPythonのコマンドラインでそれらをテストすることができました。これはコックピットのエラーを解決する非常に優れた場所であり、私は非常に多くのコックピットエラーを生成していますアウトコンセプト。

あなたが使っているという事実は、非常に良いです。私は、ロジックフローがそれらのうちの1つを通過するときに何が起こるかを見直す必要があります。コマンドラインはそれを実行するのに適しています。

3

ここでの正しい行動は、ファイルが正常に読み込まれていれば、そのデータを読み込み、新しいデータでファイルに書き込むことです。

ファイルに書き込むと、ファイルが存在しない場合は作成され、既存の内容は上書きされます。

私はまた考える、あなたは奇妙な方法で文を使用して、使用している注意したい:

try: 
    with open(filename, 'w') as f: 
     f.seek(0,0) 
     f.write(header) 
    print("Header added to", filename) 
except IOError: 
    print("Sorry could not open file, please check path") 

この方法では、より読みやすいです。

可能な限り最良の方法を確認する方法については、user1313312's answerを参照してください。私の方法は機能しますが、最善の方法ではありません、私は説明のためにそれを残します。我々は唯一のファイルへの書き込みの選択肢を持っているとして(上書き

def add_header(filename): 
    header = '"""\nName of Project"""' 
    try: 
     with open(filename, 'r') as f: 
      data = f.read() 
     with open(filename, 'w') as f: 
      f.write(header+"\n"+data) 
     print("Header added to"+filename) 
    except IOError: 
     print("Sorry could not open file, please check path") 

if __name__ == "__main__": 
    filename = raw_input("Please provide path to file: ") 
    add_header(filename) 


は旧答え:今

、あなたの問題を解決するために、あなたは本当にこのような何かをしたいです既存のコンテンツ)を追加し、(最後に)データを追加する方法を構築する必要があります。これを行うには、内容を読み込んで(同時にファイルが存在するかどうかを確認する)、ヘッダーの後ろに内容を書き込んでください(ここでは読みやすさのために改行を追加しました)。

+0

ありがとうございます、私は可読コードフォーマットを実装します。 – Neeran

-1

このスクリプトは「w」モード(書き込みモード)でファイルを開きます。つまり、ファイルが存在しないと作成されます。だからIOErrorはありません。

+0

多くの人がすでにこれを指摘しているときに、これを答えとして与えるのはなぜですか? –

関連する問題