如何在Python中确定打开文件的大小?
我有一个文件,我想确保它的大小不会超过2GB,因为它必须在一个使用ext 2文件系统的系统上运行。有什么好的方法可以检查这个文件的大小呢?需要注意的是,我会在检查之间往这个文件里写东西。特别是,我需要担心那些还没有写入磁盘的缓冲区未刷新更改吗?
7 个回答
6
os.fstat(file_obj.fileno()).st_size
这个方法应该可以解决你的问题。我觉得它会返回已经写入的字节数。如果你担心缓存的问题,可以在之前先执行一次刷新操作。
21
这可能不是你想要的答案,但我还是建议你看看。
import os
a = os.path.getsize("C:/TestFolder/Input/1.avi")
另外,对于已经打开的文件,你可以使用 fstat 这个函数。这个函数可以在打开的文件上使用。它需要一个整数类型的文件句柄,而不是文件对象,所以你需要在文件对象上使用 fileno 方法来获取这个句柄:
a = open("C:/TestFolder/Input/1.avi")
b = os.fstat(a.fileno()).st_size
4
你可以先从这样的代码开始:
class TrackedFile(file):
def __init__(self, filename, mode):
self.size = 0
super(TrackedFile, self).__init__(filename, mode)
def write(self, s):
self.size += len(s)
super(TrackedFile, self).write(s)
然后你可以这样使用它:
>>> f = TrackedFile('palindrome.txt', 'w')
>>> f.size
0
>>> f.write('A man a plan a canal ')
>>> f.size
21
>>> f.write('Panama')
27
显然,如果你不是从头开始写这个文件,这种实现方式就不太适用了,但你可以调整你的 __init__
方法来处理初始数据。你可能还需要重写其他一些方法,比如 writelines
。
这个方法不受编码影响,因为字符串其实就是一串字节。
>>> f2 = TrackedFile('palindrome-latin1.txt', 'w')
>>> f2.write(u'A man a plan a canál '.encode('latin1')
>>> f3 = TrackedFile('palindrome-utf8.txt', 'w')
>>> f3.write(u'A man a plan a canál '.encode('utf-8'))
>>> f2.size
21
>>> f3.size
22