1

現在、「Learn Python the hard way」を読んでいて、第 16 章に到達
しました。ファイルに書き込んだ後、ファイルの内容を印刷できないようです。それは単に何も印刷しません。

from sys import argv

script, filename = argv print "We are going to erase the contents of %s" % filename print "If you don\'t want that to happen press Ctrl-C" 
print "If you want to continue press enter"

raw_input("?") print "Opening the file..." target = open(filename, "w")

print "Truncating the file..." target.truncate()

print "Now i am going to ask you for 3 lines"

line_1 = raw_input("Line 1: ") 
line_2 = raw_input("Line 2: ") 
line_3 = raw_input("Line 3: ") 

final_write = line_1 + "\n" + line_2 + "\n" + line_3

print "Now I am going to write the lines to %s" % filename

target.write(final_write)

target.close

print "This is what %s look like now" %filename

txt = open(filename)

x = txt.read() # problem happens here 
print x

print "Now closing file"

txt.close
4

1 に答える 1

2

target.close関数andを呼び出しているのでtxt.closeはなく、単にそれらのポインタを取得しています。それらは関数(またはより正確にはメソッド)であるため()、関数の名前の後に呼び出す必要があります:file.close()

それが問題です。ファイルを書き込みモードで開くと、ファイルのすべてのコンテンツが削除されます。ファイルに書き込みますが、ファイルを閉じることはないため、変更はコミットされず、ファイルは空のままです。次に、それを読み取りモードで開き、空のファイルを読み取るだけです。

変更を手動でコミットするには、 を使用しますfile.flush()。または、単にファイルを閉じると、自動的にフラッシュされます。

また、コメントで述べたように、モードでtarget.truncate()開いたときにすでに自動的に行われているため、呼び出しは役に立ちません。write

編集:コメントにも記載されていますが、 usingwithステートメントは非常に強力であり、代わりに使用する必要があります。http://www.python.org/dev/peps/pep-0343/から詳細を読むことができますが、基本的にファイルで使用すると、ファイルが開き、インデントを解除すると自動的に閉じます。この方法では、ファイルを閉じることを心配する必要はありません。インデントのおかげで、ファイルが使用されている場所がはっきりとわかると、見栄えがよくなります。

簡単な例:

f = open("test.txt", "r")
s = f.read()
f.close()

withステートメントを使用して、より短く、見栄えを良くすることができます。

with open("test.txt", "r") as f:
    s = f.read()
于 2012-12-31T11:33:58.783 に答える