python文件read()显示空行

时间:2014-01-31 20:45:49

标签: python

我在网上关注了一系列教程(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()

3 个答案:

答案 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,而不必担心任何seekflush无意义。

with open(filename,'w') as w:
    w.write('something')

with open(filename) as r:
    print(r.read())