2010-01-20 31 views
486

Sto scrivendo uno script Python in Windows. Voglio fare qualcosa in base alla dimensione del file. Ad esempio, se la dimensione è maggiore di 0, invierò un'email a qualcuno, altrimenti continuerò ad altre cose.Come verificare la dimensione del file in python?

Come si controlla la dimensione del file?

risposta

464

Uso os.stat, e utilizzare il st_size membro dell'oggetto risultante:

>>> import os 
>>> statinfo = os.stat('somefile.txt') 
>>> statinfo 
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732) 
>>> statinfo.st_size 
926L 

uscita è in byte.

+13

È in byte? Orbita? –

+59

Questo è in byte –

+24

@HaikalNashuha Non conosco alcun file system che consenta file di byte frazionari –

754

piace questa (credito http://www.daniweb.com/forums/thread78629.html):

>>> import os 
>>> b = os.path.getsize("/path/isa_005.mp3") 
>>> b 
2071611L 

L'uscita è in byte.

+82

Nota: l'implementazione di 'os.path.getsize' è semplicemente' ritorno os.stat (nome del file) .st_size' – wim

+172

Ma, oh, quanto più chiara di 'st_size'! –

+0

Quindi c'è una perdita di prestazioni di un minuto dall'utilizzo di os.path.getsize in contrapposizione a os.stat (file) .st_size? – wordsforthewise

93

Le altre risposte di lavoro per i file veri e propri, ma se avete bisogno di qualcosa che funziona per "oggetti di file-like", provate questo:

# f is a file-like object. 
f.seek(0, os.SEEK_END) 
size = f.tell() 

Si lavora per i file reali e StringIO di, nel mio test limitato. (Python 2.7.3.) L'API "file-like object" non è in realtà un'interfaccia rigorosa, ma lo API documentation suggerisce che gli oggetti simili a file debbano supportare seek() e tell().

Modifica

Un'altra differenza tra questo e os.stat() è che si può stat() un file anche se non si ha il permesso di leggerlo. Ovviamente l'approccio seek/tell non funzionerà se non si ha il permesso di leggere.

Edit 2

Su suggerimento di Jonathon, Ecco una versione paranoico. (La versione di cui sopra lascia il puntatore del file alla fine del file, quindi se si dovesse provare a leggere dal file, si otterrebbe zero byte di nuovo!)

+5

Non è necessario importare 'os', invece scrivere' f.seek (0, 2) 'per cercare 0 byte dalla fine. – cdosborn

+2

E per l'ultima riga, se '' 'os''' non è usato:' '' f.seek (old_file_position, 0) '' ' – luckydonald

+23

Se si usano letterali interi invece di variabili nominate, si sta torturando qualcuno che deve mantenere il tuo codice. Non c'è motivo valido per non importare 'os'. –

31
import os 


def convert_bytes(num): 
    """ 
    this function will convert bytes to MB.... GB... etc 
    """ 
    for x in ['bytes', 'KB', 'MB', 'GB', 'TB']: 
     if num < 1024.0: 
      return "%3.1f %s" % (num, x) 
     num /= 1024.0 


def file_size(file_path): 
    """ 
    this function will return the file size 
    """ 
    if os.path.isfile(file_path): 
     file_info = os.stat(file_path) 
     return convert_bytes(file_info.st_size) 


# Lets check the file size of MS Paint exe 
# or you can use any file path 
file_path = r"C:\Windows\System32\mspaint.exe" 
print file_size(file_path) 

Risultato:

6.1 MB 
+1

la tua risposta mi è di grande aiuto .. –

+2

'questa funzione convertirà i byte in MB .... GB ... etc' Sbagliato. Questa funzione convertirà i byte in MiB, GiB, ecc. Vedi [questo post] (https://superuser.com/a/1077275/174299). – moi

9

Utilizzando pathlib (added in Python 3.4 e disponibile sul PyPI) ...

from pathlib import Path 
file = Path()/'doc.txt' # or Path('./doc.txt') 
size = file.stat().st_size 

Questa è in realtà solo un'interfaccia intorno a os.stat, ma l'utilizzo di pathlib fornisce un modo semplice per accedere ad altre operazioni relative ai file.

3

Strettamente attaccare alla domanda, il codice python (+ pseudo-codice) sarebbe:

import os 
file_path = r"<path to your file>" 
if os.stat(file_path).st_size > 0: 
    <send an email to somebody> 
else: 
    <continue to other things> 
3

C'è un bitshift trucco che uso se voglio convertire da bytes a qualsiasi altra unità. Se esegui uno spostamento a destra di 10, in pratica lo sposti con un ordine (multiplo).

Esempio: 5GB are 5368709120 bytes

print (5368709120 >> 10) # 5242880 kilo Bytes (kB) 
print (5368709120 >> 20) # 5120 Mega Bytes(MB) 
print (5368709120 >> 30) # 5 Giga Bytes(GB) 
Problemi correlati