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 ステートメントに置き換えても、何も返されません。関数でメッセージを表示するにはどうすればよいですか?

4

4 に答える 4

3

あなたは常にファイルを作成していると思います。したがって、ファイルが存在しないという例外は表示されません。ファイルを作成する権限がない可能性があるため、書き込みまたはファイル オープン書き込みを try except の下に置いても問題はありません。

Python コマンド ラインでそれらをテストするために、try except や else などのステートメントを見つけました。これは、コックピット エラーを解決するのに非常に優れた場所であり、概念を証明する際に多くのコックピット エラーを生成する経験が豊富です。

try except を使用しているという事実は非常に優れています。ロジックフローがそれらのいずれかを通過するとどうなるかを確認する必要があります。コマンドラインはそれを行うのに適した場所です。

于 2012-04-18T12:25:09.157 に答える
3

ここでの正しいアクションは、ファイルを読み込んでみることです。動作する場合は、データを読み込んでから、新しいデータでファイルに書き込みます。

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

また、 with ステートメントを奇妙な方法で使用していることにも注意してください。

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 の回答を参照してください。私の方法は機能しますが、最善の方法ではありません。説明のために残します。


古い答え:

さて、あなたの問題を解決するために、あなたは本当に次のようなことをしたいと思っています:

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)

ファイルへの書き込み (既存のコンテンツの上書き) と追加 (最後に) しか選択肢がないため、データを先頭に追加する方法を構築する必要があります。これを行うには、コンテンツを読み取り (同時にファイルが存在することを簡単にチェックします)、ヘッダーに続いてコンテンツを書き込みます (ここでは、読みやすくするために改行を追加しました)。

于 2012-04-18T12:30:08.620 に答える
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")
于 2012-04-18T12:41:49.487 に答える
-1

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

于 2012-04-18T12:42:24.233 に答える