如何在Python中确定打开文件的大小?

12 投票
7 回答
13166 浏览
提问于 2025-04-15 16:47

我有一个文件,我想确保它的大小不会超过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

撰写回答