我想确保有一个文件不会超过 2 GB(因为它必须在使用 ext 2 的系统上运行)。什么是检查文件大小的好方法,记住我将在两次检查之间写入这个文件?特别是,我是否需要担心尚未写入磁盘的缓冲、未刷新的更改?
7 回答
也许不是你想要的,但无论如何我都会建议。
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
os.fstat(file_obj.fileno()).st_size
应该做的伎俩。我认为它会返回写入的字节。如果您担心缓冲,您可以随时进行刷新。
虽然这是一个老问题,但我认为 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
我不熟悉python,但是流对象(或打开文件时得到的任何东西)没有包含流当前位置的属性吗?
类似于您使用ftell() C 函数或.NET 中的Stream.Position获得的结果。
显然,这仅在您位于流的末尾时才有效,如果您当前正在写入它,您就是。
这种方法的好处是您不必关闭文件或担心未刷新的数据。
你可以从这样的事情开始:
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
或者,如果文件已经打开:
>>> fsock = open('/etc/hosts', 'rb').read()
>>> len(fsock)
444
这就是文件的字节数。
最可靠的是创建一个包装类,它会在您打开文件时检查文件的大小,跟踪写入和查找操作,根据这些操作计算当前大小并防止超出大小限制。