我尝试了几种不同的方式,但结果似乎总是一样的。在这里文件结束之前,我无法让Python阅读。它只停止了一半左右。我尝试过二进制和ASCII模式,但这两种模式都有相同的结果。我还检查了文件中切断的任何特殊字符,但没有。另外,我已经尝试指定读取多少,但它仍然在同一个地方切断。
它是这样的:
f=open("archives/archivelog", "r")
logtext=f.read()
print logtext
无论我是普通用户还是root用户,无论是从bash还是从python调用它都会发生。
但是,如果文件与我在同一目录中,它可以正常工作。
f=open("archivelog", "r")
logtext=f.read()
print logtext
这就像一场梦。知道为什么吗?
答案 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中这样做。