簡體   English   中英

如何在Python中確定打開文件的大小?

[英]How do I determine an open file's size in Python?

有一個文件,我想確保不會超過2 GB(因為它必須在使用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應該可以解決問題。 我認為它將返回寫入的字節。 如果您擔心緩沖,可以隨時進行沖洗。

我不熟悉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__方法來處理初始數據。 您可能還需要覆蓋其他一些方法: writelineswritelines

無論編碼如何,這都有效,因為字符串只是字節序列。

>>> 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

雖然這是一個老問題,但我認為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

最可靠的是創建一個包裝類,它可以在打開文件時檢查文件的大小,跟蹤寫入和查找操作,根據這些操作計算當前大小並防止超出大小限制。

或者,如果文件已經打開:

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

那是文件的字節數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM