2008-11-12 20 views
40

¿Hay alguna forma de encontrar el tamaño de un objeto de archivo abierto actualmente?Tamaño de un objeto de archivo abierto

Específicamente, estoy trabajando con el módulo tarfile para crear archivos tar, pero no quiero que mi archivo tar de un tamaño determinado. Por lo que yo sé, los objetos tarfile son objetos similares a archivos, así que imagino que una solución genérica funcionaría.

Respuesta

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 

Adición de la idea de ChrisJY al ejemplo

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

http://docs.python.org/library/stat.html#stat.ST_SIZE 'os.fstat' return' stat' estructura, use 'st_size' – shevski

+1

¿Alguien puede arrojar algo de luz sobre la magia de' f .seek (0,2) '? ¿Por qué 'tell()' devuelve 0 sin él? –

+3

@m_poorUser 'f.seek (0, 2)' mueve la posición del objeto de archivo a 0 bytes desde el final del archivo, por lo que la posición del objeto de archivo se encuentra al final del archivo. Luego, 'f.tell()' devuelve la posición del objeto del archivo actual, que es el tamaño del archivo en este caso. Consulte https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects – EarlCrapstone

4

Si tiene el descriptor de archivo, puede usar fstat para conocer el tamaño, si corresponde. Una solución más genérica es buscar hasta el final del archivo y leer su ubicación allí.

7

Bueno, si el objeto de archivo admite el método tell, que puede hacer:

current_size = f.tell() 

que le dirá que estabas en este momento escritura. Si escribe de forma secuencial, este será el tamaño del archivo.

De lo contrario, puede utilizar las capacidades del sistema de archivos, es decir, os.fstat según lo sugerido por otros.

+0

'current_size' es un nombre de variable incorrecto ya que significa * tamaño actual * del archivo. 'tell()' proporciona la posición actual de la secuencia de archivos, es decir, dónde se realizará la siguiente lectura/escritura. – IAbstract

+1

De acuerdo con Python 3.6 doc, '.tell() Devuelve la posición actual del flujo como un número opaco. El número generalmente no representa una cantidad de bytes en el almacenamiento binario subyacente. – Devy

1

Otra solución es utilizar StringIO "si está realizando operaciones en memoria".

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

ahora body se comporta como un objeto de archivo con varios atributos como body.read().

body.len da el tamaño del archivo.

Cuestiones relacionadas