12

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

4

7 回答 7

20

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

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
于 2009-12-08T14:38:24.243 回答
6

os.fstat(file_obj.fileno()).st_size应该做的伎俩。我认为它会返回写入的字节。如果您担心缓冲,您可以随时进行刷新。

于 2009-12-08T14:44:52.700 回答
5

虽然这是一个老问题,但我认为 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
于 2014-05-17T02:47:18.670 回答
4

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

类似于您使用ftell() C 函数或.NET 中的Stream.Position获得的结果。

显然,这仅在您位于流的末尾时才有效,如果您当前正在写入它,您就是。

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

于 2009-12-08T14:47:45.570 回答
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
于 2009-12-08T15:17:58.017 回答
3

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

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

这就是文件的字节数。

于 2009-12-08T14:42:18.027 回答
2

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

于 2009-12-08T14:41:27.297 回答