2011-09-04 71 views
4

我已经尝试了这几种不同的方式,但结果总是看起来是一样的。直到文件结束,我无法读取Python。它只停留一半左右。我尝试过二进制和ASCII模式,但是这两种模式都有相同的结果。我也检查过文件中的任何特殊字符,并且没有。此外,我已经尝试指定要阅读多少内容,并且它仍然在同一个地方切断。直到文件结尾才能得到Python读取

它是这样的:

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

它发生了,我是否把它从bash中,或从蟒蛇,无论我是一个普通用户或根。

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

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

这工作就像一个梦。任何想法为什么?

+1

您是否收到任何错误讯息? – andronikus

+2

必须有别的东西。它应该同时工作。 –

+0

文件的大小(以字节为单位)以及您获得的部分块有多大? – smci

回答

2

从Kelketek的回答跳下:

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

写完后不久你在阅读文件吗?这可能会导致竞争条件(http://en.wikipedia.org/wiki/Race_condition),这是一类通常很奇怪,可能是随机/难以重现的错误,您通常不希望从像Python这样的高级语言中获得这些错误。

+0

是的,我非常喜欢。只有几行后面的文件才会被放入电子邮件并发送。谢谢你给我看这个。 – Kelketek

1

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

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

+3

“当[参数]的大小被忽略或为负时,文件的全部内容将被读取并返回......” – andronikus

+0

哦,对,错过了,对不起。但是,无论如何都要通过一个尺寸是一个很好的做法;)但是这里看起来有些不同。 – Julian

3

Python的参考手册约read()说:

还要注意的是,当在非阻塞模式中,更少的数据比被请求 可以被返回,即使是没有给出尺寸参数。

关于这个问题也有一个草案PEP,这显然没有被接受。 PEP是Python Enhancement Proposal

因此,令人难过的事情是,您不能依赖read()在一次调用中为您提供完整文件。

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

+0

这并不完全,认为这是一个很好的猜测。如果你看下面的答案,这解决了它,但我不知道为什么。我想这样解决之后,你的答案可能就是其中的一部分,但后来我意识到,因为我在Python中用shell脚本调用了该文件,并且shell脚本得到了不完整的文件,它必须与写入不相关整理和阅读()在这种情况下是无辜的。 – Kelketek

1

好了,要在记事本中先写这个,所以我不按“ENTER”太早......

我已经解决了这个问题,但我真的不知道为什么解决方案解决了这个问题。

事实证明,一个人能够通读而不是另一个的原因是因为早期被切断的那个是用Python脚本创建的,而另一个是早先创建的。

即使我关闭了文件,该文件似乎没有完全写入磁盘,或者,当我抓住它时,它只是在缓冲区中。类似的东西。

这样做:

del f 

然后试图抓住这个文件,我得到了整个文件。是的,我在写文件后使用了f.close。

所以,问题解决了,但任何人都可以给我为什么我不得不在这种情况下手动垃圾收集的原因?我不认为我必须在Python中这样做。