您没有考虑蛇皮… 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
字节可能会导致逻辑多字节字符(例如,rn
在文本模式下,我认为是Unipre中的多字节字符)或某些您不知道的底层数据结构之间的中断。 - 该文件处于非阻止模式,并且另一个进程开始访问该文件;
- 暂时无法访问该文件;
- 文件,磁盘,网络等上的潜在错误条件,可能是暂时的。
- 该程序接收到一个信号,但是信号处理程序忽略了它。
我将以这种方式重写您的代码:
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) breakf=open('somefile','rb')for block in blocks(f,2**16): # process a block that COULD be up to 65,536 bytes long


