我在网上关注了一系列教程(http://learnpythonthehardway.org/book/ex16.html),我完全陷入困境。我到处寻找答案,但似乎无法找到解决方案。如果这是一个愚蠢的问题并且完全显而易见,我道歉,但我是一个初学者。
下面的脚本可以正常工作,除了一个错误。脚本运行时,第29行的.read()命令返回空。
如果有人能告诉我为什么会这样,以及我如何解决这个问题我将非常高兴。
亲切的问候。 :)from sys import argv
script, filename = argv
print "we are going to erase the %r" % filename
print "if you do not want to do that hit ctrl C ( ^c )."
print "if you do want to do that hit return."
raw_input ("?")
print "opening the file....."
target = open (filename, "r+")
print "truncating the file. goodbye!"
target.truncate ()
print "now i am going to ask you for 3 lines"
line1 = raw_input ("line 1:")
line2 = raw_input ("line 2:")
line3 = raw_input ("line 3:")
print "now, im going to write those 3 lines to the %s file:" % filename
target.write ("%s\n%s\n%s" % (line1, line2, line3))
print "now i am going to show you the contents of the file:"
print target.read()
print "and finally we close."
target.close()
答案 0 :(得分:3)
在写入后,文件光标已移至。这是写作的自然结果。如果要阅读所写内容,则需要将文件光标重置回文件的开头:
target.seek(0)
...后续读取现在可以访问您放入文件中的文本。
答案 1 :(得分:0)
查看Input/Output上的Python文档,尤其是有关文件中位置的部分。当您写入文件时,文件位置在您编写的任何内容的末尾,直到您告诉操作系统查看文件中的其他位置。在您flush()
写入磁盘后,您需要seek()
回到文件的开头才能读取它:
>>> f = open("temp.txt", "a+")
>>> f.write("tj hoitjhiortj hiorjh rioh\n")
>>> f.flush()
>>> f.read()
''
>>> f.seek(0)
>>> f.read()
'tj hoitjhiortj hiorjh rioh\n'
>>>
答案 2 :(得分:0)
当您使用文件对象时,有一个“光标”的概念。这就是你在文件中的位置 - 在任何文本编辑器中考虑光标。
在write
到文件末尾之后,你的“光标”就在最后。你可以在那个文件句柄上多次调用read()
,你只会得到一个空字符串。
一种方法是在write
:
target.write('something')
target.flush() #may or may not be necessary, generally good idea to include it
target.seek(0)
target.read()
更合理的方法是使用上下文管理器为您处理打开/关闭文件句柄。您知道新文件句柄的光标始终位于文件的开头,因此您可以在其上调用read
,而不必担心任何seek
或flush
无意义。
with open(filename,'w') as w:
w.write('something')
with open(filename) as r:
print(r.read())