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

时间:2009-12-08 14:33:48

标签: python linux file filesystems ext2

我想确保一个文件不会超过2 GB(因为它必须在使用ext 2的系统上运行)。检查文件大小的好方法是什么,记住我将在两次检查之间写入此文件?特别是,我是否需要担心尚未写入磁盘的缓冲,未刷新的更改?

7 个答案:

答案 0 :(得分:17)

也许不是你想要的,但无论如何我都会建议。

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

答案 1 :(得分:6)

os.fstat(file_obj.fileno()).st_size应该做到这一点。我认为它将返回写入的字节。如果您担心缓冲,可以随时进行冲洗。

答案 2 :(得分:4)

我不熟悉python,但是流对象(或打开文件时得到的任何对象)是否具有包含流的当前位置的属性?

与使用ftell() C函数或.NET中的Stream.Position类似。

显然,只有当你位于流的末尾时才有效,如果你当前正在写它,那么你就是这样。

这种方法的好处是您不必关闭文件或担心未刷新的数据。

答案 3 :(得分: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

答案 4 :(得分:4)

虽然这是一个老问题,但我认为Isak有最简单的解决方案。以下是如何在Python中执行此操作:

# Assuming f is an open file
>>> pos = f.tell()  # Save the current position
>>> f.seek(0, 2)  # Seek to the end of the file
>>> length = f.tell()  # The current position is the length
>>> f.seek(pos)  # Return to the saved position
>>> print length
1024

答案 5 :(得分:2)

最可靠的是创建一个包装类,它可以在打开文件时检查文件的大小,跟踪写入和查找操作,根据这些操作计算当前大小并防止超出大小限制。

答案 6 :(得分:2)

或者,如果文件已经打开:

>>> fsock = open('/etc/hosts', 'rb').read()
>>> len(fsock)
444

这是文件的字节数。