Python 脚本在文件结束之前终止读取

Python 脚本在文件结束之前终止读取,python,binary,ascii,Python,Binary,Ascii,我试图读取一个包含ASCII头和二进制数据段的文件,但Python解释器似乎过早地关闭了该文件(即在到达文件末尾之前)。以下是我用Python 2.7.12开发的代码: fileSize = os.path.getsize(filename) # file size in bytes bytesRead = 0L content = [] with open(filename,'r') as f: content = f.read() bytesRead += sys.getsi

我试图读取一个包含ASCII头和二进制数据段的文件,但Python解释器似乎过早地关闭了该文件(即在到达文件末尾之前)。以下是我用Python 2.7.12开发的代码:

fileSize = os.path.getsize(filename) # file size in bytes
bytesRead = 0L
content = []
with open(filename,'r') as f:
    content = f.read()
    bytesRead += sys.getsizeof(content)

print 'File size:',fileSize
print 'Total read:',bytesRead
但是,在读取了77MB文件总量中约1MB的数据后,该文件会提前关闭

print 'File size:',fileSize
print 'Total read:',bytesRead
产生:
文件大小:76658457,总读取量:1165436

它存在于一个二进制部分中。我对原始程序进行了moid化,以从文件关闭时开始迭代地重新打开该文件,如下所示:

fileSize = os.path.getsize(filename) # file size in bytes
bytesRead = 0L
content = []

try:
    while True:
        count += 1
        with open(filename,'r') as f:
            f.seek(bytesRead+1)
            newContent = f.read()
            content.append(newContent)
            bytesRead += sys.getsizeof(newContent)
            print count,' Total read:',bytesRead
except Exception,e:
    print e

print 'File size:',fileSize
print '% read = ',bytesRead*100./float(fileSize)
print 'count: ',count
这使得:

1总计读取:1165436
2总计:1180218
3总计:1181902
... [更多迭代]。。。
25564总计:77925641
25567总计:77926615
25568总读取:异常:对关闭的文件执行I/O操作
文件大小:76658457
%读数=101.65429721603
总数:25568

你知道我如何说服Python不要一直关闭文件,而是一次读取所有文件吗?

我认为发生的事情是检查字节大小,而不是数组中的实际数据。检查数组的最后一行,然后检查文件的最后一行,很可能会发现它实际上正在读取整个文件

这是一个奇数输出。首先,您甚至不增加
计数
,那些
打印
命令如何打印
1
2
3
等?第二,Python2.7文档明确声明,当调用
read()
而不带参数时,它将读取整个文件()。你确定你正在展示的代码就是实际正在执行的代码吗?有些操作系统,比如Windows,处理文本文件的方式不同于二进制文件。例如,它们处理换行符的方式。Windows文本文件中还可以包含EOF(文件结束)字符。代码似乎正在以默认文本模式读取文件。尝试以二进制模式以
打开(文件名,'rb')打开文件,如f:
您需要以二进制模式打开文件。如果在模式下不包含
b
,python将更改文件内容,可能会插入EOF或换行符。切勿使用
sys.getsizeof()
。在您的情况下,您希望使用
len()
。将增量添加到count中-否则,代码就是生成输出的代码。我将很快对其进行测试,但我怀疑答案是按照martineau的建议,以二进制模式打开文件。