2011-07-26 262 views
42

En mi aplicación, escribo en un archivo de Excel. Después de escribir, el usuario puede ver el archivo abriéndolo. Pero si el usuario olvida cerrar el archivo antes de continuar escribiendo, aparecerá un mensaje de advertencia. Entonces necesito una forma de comprobar que este archivo esté abierto antes de escribir el proceso. ¿Podría proporcionarme algún código de Python para hacer esta tarea?compruebe si un archivo está abierto en Python

Gracias de antemano.

Respuesta

30

asumo que usted está escribiendo en el archivo, y luego cerrarla (por lo que el usuario puede abrir en Excel), y luego, antes de volver a abrirlo para las operaciones de agregación/escritura , ¿quiere verificar que el archivo aún no está abierto en Excel?

Así es como se debe hacer lo siguiente:

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

No funciona. Todavía puedo abrir un archivo que se abre con 'w +' por otro proceso. – Ace

+0

@Ace: ¿Estás hablando de Excel? Esta pregunta es sobre Excel y cómo afecta el bloqueo de archivos. –

+1

Esto es específico de Windows, la pregunta es sobre Excel, entonces tiene sentido, pero no en todos los escenarios, esto será cierto. Por ejemplo, si un volumen está montado en la red, no puede saber si el archivo está abierto si lo prueba en otra computadora en la red, en particular en servidores o clientes UNIX o Linux. – Havok

3

Puede usar con abrir ("ruta") como archivo: para que se cierre automáticamente, de lo contrario, si está abierto en otro proceso puede intentar como en el ejemplo de Tims debe usar excepto IOError para no ignorar ningún otro problema con su código :)

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

Nunca haga un 'excepto' sin especificar la excepción que desea capturar. Además, el alcance de su bloque 'try' es demasiado amplio: Shansal quiere comprobar si el archivo se puede abrir en absoluto. El manejo de errores al escribir en el archivo (o cualquier otra cosa que ocurra en el bloque 'with') debe ser separado. –

+0

gracias por señalar :) – thabubble

+0

Al igual que la respuesta anterior, esto no tiene nada que ver con lo que estaba pidiendo el OP. –

28

Si todo lo que importa es el proceso actual, una forma fácil es usar el atributo de objeto de archivo "cerrado"

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

¡Esto no detectará si el archivo está abierto por otros procesos!

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

+20

El atributo '.closed' comprueba si el archivo está cerrado por el proceso actual de Python. No verifica si el archivo está abierto o cerrado por cualquier otro proceso. – temoto

+0

@Rmhero gracias, estaba buscando esto – Veltro

+7

@Rmhero: Por favor, considere eliminar su respuesta, porque es incorrecta, por lo tanto, puede llevar a la gente a escribir código que se comporta de manera diferente a la prevista. Funciona como describe @temoto. Para ver esto, simplemente abra dos shells 'ipython', luego' f = open ('foo.txt', 'w') 'en uno, pero' f = open ('foo.txt', 'r') 'en el otro. Entonces 'f.closed es False', pero' f.close() 'en el segundo terminal es suficiente para convertir esto en' f.closed es True'. –

2

Ninguno de los otros ejemplos proporcionados funcionaría para mí cuando se trata de este tema específico con Excel en Windows 10. La única otra opción que podía pensar era tratar de cambiar el nombre del archivo o directorio que contiene el archivo temporalmente, luego cámbiele el nombre.

import os 

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

Esta no es una mala solución si tiene pocos usuarios para el archivo ... de hecho es una especie de mecanismo de bloqueo en un archivo privado. –

+0

Tenga en cuenta que esto es muy específico de Windows, ya que la mayoría de los sistemas operativos cambiarán el nombre de los archivos si ya están abiertos. – RandomInsano

Cuestiones relacionadas