Fichiers en python

Résolu
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005 - 13 juin 2005 à 11:28
taz_iup Messages postés 179 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 21 mai 2014 - 15 juin 2005 à 10:19
Salut,



Etant novice en python, je bloque sur un truc :

Dans un de mes programmes, a un moment, je dois recopier un
fichier (en le modifiant) d'un répertoire vers un autre. Je sais que le
nouveau fichier ne sera pas plus gros que celui d'origine.

Mais étant donné que ce sont des fichiers de plusieurs GO, il me faut controler s'il y a assez d'espace libre.

C'est pourquoi :



Pouvez vous me dire comment je peux connaitre :

1/ la taille d'un fichier

2/ l'espace libre dans un répertoire



De maniere portable (linux, win et mac)

J'ai cherché dans os.path, qui contient des outils assez proches, mais je n'ai rien trouvé de tel.

Merci

11 réponses

taz_iup Messages postés 179 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 21 mai 2014 3
13 juin 2005 à 11:57
j'ai trouve ceci sur python.org



la methode stat du module os permet de retrouver la taille d'un
fichier. et la méthode statvfs permet de retrouver la taille libre mais
n'est disponible que sous UNIX. c'est déjà un début...

http://www.python.org/doc/2.4.1/lib/os-file-dir.html
3
taz_iup Messages postés 179 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 21 mai 2014 3
13 juin 2005 à 12:31
pour windows tu peux utiliser win32com

mais c'est moyen comme solution...



import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")
colItems = objSWbemServices.ExecQuery("Select * from Win32_LogicalDisk")
for objItem in colItems:
print "Access: ", objItem.Access
print "Availability: ", objItem.Availability
print "Block Size: ", objItem.BlockSize
print "Caption: ", objItem.Caption
print "Compressed: ", objItem.Compressed
print "Config Manager Error Code: ", objItem.ConfigManagerErrorCode
print "Config Manager User Config: ", objItem.ConfigManagerUserConfig
print "Creation Class Name: ", objItem.CreationClassName
print "Description: ", objItem.Description
print "Device ID: ", objItem.DeviceID
print "Drive Type: ", objItem.DriveType
print "Error Cleared: ", objItem.ErrorCleared
print "Error Description: ", objItem.ErrorDescription
print "Error Methodology: ", objItem.ErrorMethodology
print "File System: ", objItem.FileSystem
print "Free Space: ", objItem.FreeSpace
print "Install Date: ", objItem.InstallDate
print "Last Error Code: ", objItem.LastErrorCode
print "Maximum Component Length: ", objItem.MaximumComponentLength
print "Media Type: ", objItem.MediaType
print "Name: ", objItem.Name
print "Number Of Blocks: ", objItem.NumberOfBlocks
print "PNP Device ID: ", objItem.PNPDeviceID
z = objItem.PowerManagementCapabilities
if z is None:
a = 1
else:
for x in z:
print "Power Management Capabilities: ", x
print "Power Management Supported: ", objItem.PowerManagementSupported
print "Provider Name: ", objItem.ProviderName
print "Purpose: ", objItem.Purpose
print "Quotas Disabled: ", objItem.QuotasDisabled
print "Quotas Incomplete: ", objItem.QuotasIncomplete
print "Quotas Rebuilding: ", objItem.QuotasRebuilding
print "Size: ", objItem.Size
print "Status: ", objItem.Status
print "Status Info: ", objItem.StatusInfo
print "Supports Disk Quotas: ", objItem.SupportsDiskQuotas
print "Supports File-Based Compression: ", objItem.SupportsFileBasedCompression
print "System Creation Class Name: ", objItem.SystemCreationClassName
print "System Name: ", objItem.SystemName
print "Volume Dirty: ", objItem.VolumeDirty
print "Volume Name: ", objItem.VolumeName
print "Volume Serial Number: ", objItem.VolumeSerialNumber
0
taz_iup Messages postés 179 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 21 mai 2014 3
13 juin 2005 à 12:37
enfin apparement, il n'existe pas de solution "universelle".

Je pense que le meilleur moyen est de passer par une commande system:

os.popen2 couple avec un test sur la platform (os.platform)

voila tiens nous au courant
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
13 juin 2005 à 13:26
alors, voila ou j'en suis :



ma question 1 etait : comment savoir la taille d'un fichier.


Et effectivement stat marche impecc merci beaucoup :)



pour savoir la place libre, je ne vois pas quelle membre de
statvfs la renvoie. Elle renvoie plein de trucs, mais pas la taille
libre (enfin, je n'ai pas l'impression). Ce n'est ni "free nodes" ni
"free blocks" a priori

Je vais continuer a chercher, et je te remercie beaucoup :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
taz_iup Messages postés 179 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 21 mai 2014 3
13 juin 2005 à 13:53
ton disque est constitué de bloc reste a savoir la taille d'un block...

mais je crois que statvfs le donne aussi... de toute façon cette fonction n'est dispo que sous UNIX... :'(

donc elle ne résud pas ton problème pour Windows et Mac...
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
13 juin 2005 à 17:00
J'ai fini tout le reste du programme, je vais donc ne plus me
concentrer que sur ca. J'ai cherché comment connaître la taille d'un
bloc, mais je ne trouve pas.

ca doit pourtant bien exister, mais les seuls trucs que j'ai trouvé c'est que c'est "variable", ce qui ne m'aide pas beaucoup :)

Je tiens au courant de ce que je trouve, et en attendant, si quelqu'un a une solution, elle sera vraiment la bienvenue :)









ps : c'est marrant la programmation, des fois des trucs super
compliques se font tout seuls, et des fois des trucs qui paraissent
basiques comme ca, et ben on bloque dessus.
0
taz_iup Messages postés 179 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 21 mai 2014 3
13 juin 2005 à 17:19
la fonction statvfs te donne ces infos



* : <nobr><tt id= \\"l2h-1621\\" xml:id=\\"l2h-1621\\" class=\\"function\\">statvfs</tt>(</nobr>,
<var>path</var>)

Perform a <tt>statvfs()</tt> system call on the given path. The
return value is an object whose attributes describe the filesystem on
the given path, and correspond to the members of the
<tt>statvfs</tt> structure, namely:
<tt>f_frsize</tt>,
<tt>f_blocks</tt>,
<tt>f_bfree</tt>,
<tt>f_bavail</tt>,
<tt>f_files</tt>,
<tt>f_ffree</tt>,
<tt>f_favail</tt>,
<tt>f_flag</tt>,
<tt>f_namemax</tt>.
Availability: Unix.

For backward compatibility, the return value is also accessible as a
tuple whose values correspond to the attributes, in the order given above.
The standard module <tt>statvfs</tt>
defines constants that are useful for extracting information
from a <tt>statvfs</tt> structure when accessing it as a sequence; this
remains useful when writing code that needs to work with versions of
Python that don't support accessing the fields as attributes.

Changed in version 2.2:
Added access to values as attributes of the returned object.

Statfvs Module



The <tt>statvfs</tt> module defines constants so interpreting the result
if <tt>os.statvfs()</tt>, which returns a tuple, can be made without
remembering ``magic numbers.'' Each of the constants defined in this
module is the index of the entry in the tuple returned by
<tt>os.statvfs()</tt> that contains the specified information.




* : <tt id =\"l2h-1789\" xml:id= \"l2h-1789\">F_BSIZE</tt></gras>
Preferred file system block size.




* : <tt id =\"l2h-1790\" xml:id=\"l2h-1790\">F_FRSIZE</tt></gras>
Fundamental file system block size.
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
14 juin 2005 à 08:25
Merci taz_iup.

Etant donné qu'il me faut faire un programme
portable, marchant dans tout os, mon responsable m'a dit de laisser
tomber, que ca n'a pas d'importance, qu'on n'a pas le temps, et
simplement, grace a la méthode stat, si le fichier dépasse 1.5GO, j'en
informe l'utilisateur. Sinon, j'aime bien le python, c'est simple,
sympa et pas très lent pour un langage interprété.



Merci beaucoup et bon courage.
0
taz_iup Messages postés 179 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 21 mai 2014 3
14 juin 2005 à 19:24
ok, mais je trouve ca bizarre quand même qu'il n'y ai pas de fonctions
prévue pour ce genre de fonctionnalité pourtant très courante je pense.



si tu veux rester portable, je pense que le plus rapide est :

if( os.platform='XXX' ):

os.popen(...)

elif( os.platform='YYY'):
0
darfeuille Messages postés 63 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 25 juillet 2005
15 juin 2005 à 08:14
ouaip, moi aussi je trouve ca bizarre. Surtout que ca doit etre assez fréquent comme besoin.

Dans l'êtat actuel des choses, j'ai laissé faire, je regarde
juste la taille du fichier pour avertir s'il dépasse 1 GO. Comme ce
programme est destiné a des chimio-informaticiens, on peut envisager
qu'ils sauront en tenir compte . Mais
quand j'aurais fini le reste, je reviendrais dessus pour faire ce test
proprement, et je mettrais le code source ici (si ca marche bien sur :p)



Merci, et a bientôt
0
taz_iup Messages postés 179 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 21 mai 2014 3
15 juin 2005 à 10:19
ok merci a toi bon courage...
0
Rejoignez-nous