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