Python EOF用于file.read()的多字节请求
file.read()上的Python文档指出An
empty string is returned when EOF is encountered immediately.
该文档进一步指出:
请注意,此方法可能多次调用基础C函数fread(),以获取尽可能接近大小的字节。还要注意,在非阻塞模式下,即使没有给出size参数,返回的数据也可能少于请求的数据。
我相信圭多提出了他的看法上并不f.eof增加()清透因此需要使用Python是这样!
但是,对我来说尚不明确的是,如果您收到的读少于请求的字节数,但确实收到了一些,这是否是您已经达到EOF的确定性测试。
即:
with open(filename,'rb') as f:
while True:
s=f.read(size)
l=len(s)
if l==0:
break # it is clear that this is EOF...
if l<size:
break # ? Is receiving less than the request EOF???
break
如果收到的呼叫少于请求的字节数,是否有潜在的错误file.read(size)
?
-
您没有考虑蛇皮… Python不是C。
首先,回顾一下:
- st = f.read()读取EOF,或者如果以二进制形式打开,则读取到最后一个字节;
- st = f.read(n) 尝试 读取
n
字节,并且在任何情况下均不超过n
字节; - st = f.readline()一次读取一行,该行以’\ n’或EOF结尾;
- st = f.readlines()使用readline()读取文件中的所有行,并返回这些行的列表。
如果文件读取方法位于EOF处,则返回
''
。其他类型的“ file
like”方法(如StringIO,socket.makefile等)也使用了相同类型的EOF测试。最肯定的是,返回小于n
字节的f.read(n)
内容不是EOF的决定性测试!尽管该代码可以工作99.99%时间,是无法工作的时间,这将使您非常沮丧。再加上,它是不良的Python形式,n
在这种情况下,唯一的用途是对返回值的大小设置上限。有哪些原因Python的类似文件的方式回报 少 比
n
字节?- EOF无疑是一个常见原因;
- 网络套接字可能会在读取时超时,但保持打开状态;
- 确切的
n
字节可能会导致逻辑多字节字符(例如,\r\n
在文本模式下,我认为是Unicode中的多字节字符)或某些您不知道的底层数据结构之间的中断。 - 该文件处于非阻止模式,并且另一个进程开始访问该文件;
- 暂时无法访问该文件;
- 文件,磁盘,网络等上的潜在错误条件,可能是暂时的。
- 该程序接收到一个信号,但是信号处理程序忽略了它。
我将以这种方式重写您的代码:
with open(filename,'rb') as f: while True: s=f.read(max_size) if not s: break # process the data in s...
或者,编写一个生成器:
def blocks(infile, bufsize=1024): while True: try: data=infile.read(bufsize) if data: yield data else: break except IOError as (errno, strerror): print "I/O error({0}): {1}".format(errno, strerror) break f=open('somefile','rb') for block in blocks(f,2**16): # process a block that COULD be up to 65,536 bytes long