在文件结束之前无法让Python读取

时间:2011-09-04 03:22:39

标签: python linux file directory

我尝试了几种不同的方式,但结果似乎总是一样的。在这里文件结束之前,我无法让Python阅读。它只停止了一半左右。我尝试过二进制和ASCII模式,但这两种模式都有相同的结果。我还检查了文件中切断的任何特殊字符,但没有。另外,我已经尝试指定读取多少,但它仍然在同一个地方切断。

它是这样的:

f=open("archives/archivelog", "r")
logtext=f.read()
print logtext
无论我是普通用户还是root用户,无论是从bash还是从python调用它都会发生。

但是,如果文件与我在同一目录中,它可以正常工作。

f=open("archivelog", "r")
logtext=f.read()
print logtext

这就像一场梦。知道为什么吗?

4 个答案:

答案 0 :(得分:3)

关于read()的Python参考手册说:

  

另请注意,在非阻塞模式下,数据少于请求的数据   可能会被退回,即使没有给出尺寸参数。

还有关于此事的PEP草案,显然未被接受。 PEP是Python Enhancement Proposal

令人悲伤的是,您不能依靠read()在一次通话中为您提供完整档案。

如果文件是文本文件,我建议您改用readlines()。它会给你一个包含文件每一行的列表。据我所知,readlines()是可靠的。

答案 1 :(得分:2)

从Kelketek的回答中跳出来:

我不记得我在哪里读到过这个,但基本上Python垃圾收集器“偶尔”运行,不能保证何时收集给定的对象。 flush()函数执行相同的操作:http://docs.python.org/library/stdtypes.html#file.flush。我收集的是flush()将数据放入一些缓冲区进行编写,由操作系统决定何时进行编写。可能其中一个或两个都是你的问题。

你写完后很快就读到了这个文件吗?这可能会导致竞争条件(http://en.wikipedia.org/wiki/Race_condition),这是一类通常很奇怪的,可能是随机/难以重现的错误,而这些错误通常不会像Python这样的高级语言所期望的。

答案 2 :(得分:1)

read方法以块的形式返回文件内容。你必须再次调用它,直到它返回一个空字符串('')。

http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects

答案 3 :(得分:1)

好的,首先要在记事本中写这个,所以我不要太早按'输入'......

我已经解决了这个问题,但我不确定解决方案是什么解决了这个问题。

事实证明,之所以能够通读而不是另一个是因为早期被切断的是使用Python脚本创建的,而另一个是先前创建的。

即使我关闭了文件,该文件似乎也没有完全写入磁盘,或者,当我抓住它时,它只是缓冲区中的内容。这样的事情。

通过做:

 del f

然后尝试抓取文件,我得到了整个文件。是的,我在写完文件后确实使用了f.close。

所以,问题解决了,但是有人能告诉我为什么我必须在这个例子中手动收集垃圾?我不认为我必须在Python中这样做。