2011-07-26 25 views
42

Dans mon application, j'écris dans un fichier Excel. Après l'écriture, l'utilisateur peut voir le fichier en l'ouvrant. Mais si l'utilisateur oublie de fermer le fichier avant d'écrire, un message d'avertissement devrait apparaître. J'ai donc besoin d'un moyen de vérifier que ce fichier est ouvert avant d'écrire le processus. Pourriez-vous me fournir du code python pour faire cette tâche?vérifier si un fichier est ouvert en Python

Merci d'avance.

Répondre

30

Je suppose que vous écrivez le fichier, puis fermez-(afin que l'utilisateur peut l'ouvrir dans Excel), puis, avant la réouverture pour les opérations append/écriture , vous voulez vérifier que le fichier n'est pas encore ouvert dans Excel?

Voici comment vous devriez le faire:

try: 
    myfile = open("myfile.csv", "r+") # or "a+", whatever you need 
except IOError: 
    print "Could not open file! Please close Excel!" 

with myfile: 
    do_stuff() 
+2

Cela ne fonctionne pas. Je peux toujours ouvrir un fichier qui est ouvert avec 'w +' par un autre processus. – Ace

+0

@Ace: Parlez-vous d'Excel? Cette question concerne Excel et son incidence sur le verrouillage des fichiers. –

+1

Ceci est spécifique à Windows, la question étant sur Excel, alors il est logique, mais pas dans tous les scénarios ce sera vrai. Par exemple, si un volume est monté sur le réseau, vous ne pouvez pas savoir si le fichier est ouvert si vous l'essayez dans un autre ordinateur du réseau, en particulier des serveurs ou des clients UNIX ou Linux. – Havok

3

Vous pouvez utiliser avec open ("path") comme fichier: afin qu'il se ferme automatiquement, sinon s'il est ouvert dans un autre processus, vous pouvez essayer comme dans l'exemple de Tims, vous devez utiliser IOError pour ne pas ignorer tout autre problème avec votre code :)

try: 
    with open("path", "r") as file:#or just open 
     #Code here 
except IOError: 
    #raise error or print 
+5

Aussi, la portée de votre bloc 'try' est trop large - Shansal veut vérifier si le fichier peut être ouvert du tout. La gestion des erreurs lors de l'écriture dans le fichier (ou tout ce qui se passe dans le bloc 'with ') doit être séparée. –

+0

merci d'avoir souligné :) – thabubble

+0

Comme la réponse ci-dessus, cela n'a rien à voir avec ce que l'OP demandait. –

28

Si tout ce que vous aimez est le processus actuel, un moyen facile est d'utiliser l'attribut objet fichier « fermé »

f = open('file.py') 
if f.closed: 
    print 'file is closed' 

Cela ne détectera pas si le fichier est ouvert par d'autres processus!

source: http://docs.python.org/2.4/lib/bltin-file-objects.html

+20

L'attribut '.closed' vérifie si le fichier est fermé par le processus Python en cours. Il ne vérifie pas si le fichier est ouvert ou fermé par un autre processus. – temoto

+0

@Rmhero merci, je cherchais cela – Veltro

+7

@Rmhero: S'il vous plaît envisager de supprimer votre réponse, car il est incorrect, ce qui peut amener les gens à écrire du code qui se comporte différemment que prévu. Cela fonctionne comme @temoto décrit. Pour le voir, il suffit d'ouvrir deux shells 'ipython', puis' f = open ('foo.txt', 'w') 'dans un, mais' f = open ('foo.txt', 'r') 'dans L'autre. Alors 'f.closed 'est False', mais' f.close() 'dans le second terminal suffit pour le transformer en' f.closed is True'. –

2

Aucun des autres exemples fournis travaillerait pour moi face à ce problème spécifique avec Excel sur Windows 10. La seule autre option que je pouvais penser était d'essayer de renommer le fichier ou répertoire contenant le fichier temporairement, puis le renommer. N'effectuez jamais un `except` sans spécifier l'exception que vous voulez attraper.

import os 

try: 
    os.rename('file.xls', 'tempfile.xls') 
    os.rename('tempfile.xls', 'file.xls') 
except OSError: 
    print('File is still open.') 
+0

Ce n'est pas une mauvaise solution si vous avez peu d'utilisateurs pour le fichier ... c'est en effet une sorte de mécanisme de verrouillage sur un fichier privé. –

+0

Soyez conscient que c'est très spécifique à Windows, car la plupart des autres systèmes d'exploitation renommez les fichiers s'ils sont déjà ouverts. – RandomInsano

Questions connexes