web-dev-qa-db-fra.com

vérifie si un fichier est ouvert dans Python

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

Merci d'avance.

50
Shansal

Je suppose que vous écrivez dans le fichier, puis fermez-le (pour que l'utilisateur puisse l'ouvrir dans Excel), puis, avant de le rouvrir pour des opérations d'ajout/écriture, vous voulez vérifier que le fichier n'est pas toujours ouvrir 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()
38
Tim Pietzcker

Si vous ne vous souciez que du processus en cours , une méthode simple consiste à utiliser l'attribut d'objet de 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

39
Rmhero

Aucun des autres exemples fournis ne fonctionnerait pour moi si je traitais de ce problème spécifique avec Excel sous Windows 10. La seule autre option à laquelle je pouvais penser était d'essayer de renommer temporairement le fichier ou le répertoire contenant le fichier, puis de le renommer.

import os

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

Vous pouvez utiliser avec open ("chemin") en tant que fichier: pour qu'il se ferme automatiquement, sinon s'il est ouvert dans un autre processus, vous pouvez peut-être essayer comme dans l'exemple de Tims que vous devriez utiliser à l'exception de IOError pour ne pas ignorer tout autre problème lié à votre code :)

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

En utilisant

try:
with open("path", "r") as file:#or just open

peut causer des problèmes lorsque le fichier est ouvert par d’autres processus (c’est-à-dire que l’utilisateur l’a ouvert manuellement). Vous pouvez résoudre votre problème en utilisant la bibliothèque win32com. Le code ci-dessous vérifie si des fichiers Excel sont ouverts et si aucun ne correspond au nom de votre fichier, en ouvre un nouveau.

import win32com.client as win32
xl = win32.gencache.EnsureDispatch('Excel.Application')

my_workbook = "wb_name.xls"
xlPath="my_wb_path//" + my_workbook


if xl.Workbooks.Count > 0:
    # if none of opened workbooks matches the name, openes my_workbook 
    if not any(i.Name == my_workbook for i in xl.Workbooks): 
        xl.Workbooks.Open(Filename=xlPath)
        xl.Visible = True
#no workbooks found, opening
else:  
    xl.Workbooks.Open(Filename=xlPath)
    xl.Visible = True

'xl.Visible = True is not necessary, used just for convenience'

J'espère que cela aidera

0
jabba