Python EOF用于file.read()的多字节请求

发布于 2021-01-29 17:01:00

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)

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您没有考虑蛇皮… 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字节?

    1. EOF无疑是一个常见原因;
    2. 网络套接字可能会在读取时超时,但保持打开状态;
    3. 确切的n字节可能会导致逻辑多字节字符(例如,\r\n在文本模式下,我认为是Unicode中的多字节字符)或某些您不知道的底层数据结构之间的中断。
    4. 该文件处于非阻止模式,并且另一个进程开始访问该文件;
    5. 暂时无法访问该文件;
    6. 文件,磁盘,网络等上的潜在错误条件,可能是暂时的。
    7. 该程序接收到一个信号,但是信号处理程序忽略了它。

    我将以这种方式重写您的代码:

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看