2008-11-12 8 views
40

Existe-t-il un moyen de trouver la taille d'un objet fichier actuellement ouvert? En particulier, je travaille avec le module tarfile pour créer des fichiers tar, mais je ne veux pas que mon fichier tar dépasse une certaine taille. Autant que je sache, les objets tarfiles sont des objets semblables à des fichiers, alors j'imagine qu'une solution générique fonctionnerait.Taille d'un objet fichier ouvert

Répondre

66
$ ls -la chardet-1.0.1.tgz 
-rwxr-xr-x 1 vinko vinko 179218 2008-10-20 17:49 chardet-1.0.1.tgz 
$ python 
Python 2.5.1 (r251:54863, Jul 31 2008, 22:53:39) 
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('chardet-1.0.1.tgz','rb') 
>>> f.seek(0,2) 
>>> f.tell() 
179218L 

Ajout l'idée de ChrisJY à l'exemple

>>> import os 
>>> os.fstat(f.fileno()).st_size 
179218L 
>>>   
+0

http://docs.python.org/library/stat.html#stat.ST_SIZE 'os.fstat' renvoie la structure' stat', veuillez utiliser 'st_size' – shevski

+1

Quelqu'un peut-il nous éclairer sur la magie de' f .seek (0,2) '? Pourquoi 'tell()' renvoie 0 sans lui? –

+3

@m_poorUser 'f.seek (0, 2)' déplace la position de l'objet fichier à 0 octets à la fin du fichier, de sorte que la position de l'objet fichier se trouve à la fin du fichier. Ensuite, 'f.tell()' renvoie la position de l'objet fichier en cours, qui est la taille du fichier dans ce cas. Voir https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects – EarlCrapstone

4

Si vous avez le descripteur de fichier, vous pouvez utiliser fstat pour connaître la taille, le cas échéant. Une solution plus générique consiste à chercher jusqu'à la fin du fichier, et à lire son emplacement là.

7

Eh bien, si l'objet de fichier en charge la méthode tell, vous pouvez faire:

current_size = f.tell() 

Cela vous TELL il est actuellement l'écriture. Si vous écrivez de manière séquentielle, ce sera la taille du fichier. Sinon, vous pouvez utiliser les capacités du système de fichiers, par exemple os.fstat comme suggéré par d'autres.

+0

'current_size' est un mauvais nom de variable car il signifie * taille actuelle * du fichier. 'tell()' donne la position actuelle du flux de fichier - c'est-à-dire, où la prochaine lecture/écriture se produira. – IAbstract

+1

Selon le document Python 3.6, '.tell() Renvoie la position du flux en cours en tant que numéro opaque. Le nombre ne représente généralement pas un nombre d'octets dans le stockage binaire sous-jacent. – Devy

1

Une autre solution utilise StringIO "si vous effectuez des opérations en mémoire".

with open(file_path, 'rb') as x: 
    body = StringIO() 
    body.write(x.read()) 
    body.seek(0, 0) 

Maintenant body se comporte comme un objet de fichier avec différents attributs tels que body.read().

body.len donne la taille du fichier.