有一个文件,我希望确保它的大小不会超过2GB(因为它必须在使用ext 2的系统上运行)。有什么好的方法可以检查文件的大小,考虑到我将在检查之间写入此文件吗?特别是,我需要担心尚未写入磁盘的缓冲,未刷新的更改吗?
有一个文件,我希望确保它的大小不会超过2GB(因为它必须在使用ext 2的系统上运行)。有什么好的方法可以检查文件的大小,考虑到我将在检查之间写入此文件吗?特别是,我需要担心尚未写入磁盘的缓冲,未刷新的更改吗?有一个文件,我希望确保它的大小不会超过2GB(因为它必须在使用ext 2的系统上运行)。有什么好的方法可以检查文件的大小,考虑到我将在检查之间写入此文件吗?特别是,我需要担心尚未写入磁盘的缓冲,未刷新的更改吗?
有一个文件,我希望确保它的大小不会超过2GB(因为它必须在使用ext 2的系统上运行)。有什么好的方法可以检查文件的大小,考虑到我将在检查之间写入此文件吗?特别是,我需要担心尚未写入磁盘的缓冲,未刷新的更改吗?也许不是你想要的,但我还是会建议一下。
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
可以解决问题。我认为它会返回已写入的字节数。如果您担心缓冲,请先执行刷新。
# 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
tell
和 seek
之间不写入数据就不会有问题,但我可能是错的。在我的测试中没有出现问题,但看起来这些问题因平台而异。感谢你指出这一点。 - Trenton您可以从以下内容开始:
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
我不熟悉Python,但打开文件时获得的流对象(或任何你所获得的对象)是否有一个包含流当前位置的属性?
类似于C函数ftell()或.NET中的Stream.Position所获得的内容。
显然,只有当你位于流的末尾时才有效,如果你当前正在向其中写入数据,则已位于末尾。
这种方法的好处是,你不必关闭文件或担心未刷新的数据。
f.tell()
在追加模式下似乎不可靠。除非你首先执行 f.seek(0,2)
。我不知道为什么会这样。 - personal_cloud>>> fsock = open('/etc/hosts', 'rb').read()
>>> len(fsock)
444
最可靠的方法是创建一个包装类,在打开文件时检查文件大小,跟踪写入和查找操作,基于这些操作计算当前大小并防止超过大小限制。