2011-07-26 23 views
42

W mojej aplikacji piszę do pliku Excela. Po zapisaniu użytkownik może wyświetlić plik, otwierając go. Ale jeśli użytkownik zapomni zamknąć plik przed dalszym pisaniem, powinien pojawić się komunikat ostrzegawczy. Potrzebuję więc sposobu sprawdzenia, czy ten plik jest otwarty przed rozpoczęciem pisania. Czy możesz dostarczyć mi jakiegoś kodu Pythona do wykonania tego zadania?Sprawdź, czy plik jest otwarty w Pythonie

Z góry dziękuję.

Odpowiedz

30

Zakładam, że piszesz do pliku, a następnie zamknij ją (dzięki czemu użytkownik może otworzyć go w programie Excel), a następnie, przed ponownym otwarciem go dla operacji append/zapisu , chcesz sprawdzić, czy plik nie jest otwarty w programie Excel?

Jest to, jak należy to zrobić:

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

To nie działa. Nadal mogę otworzyć plik, który jest opend z "w +" przez inny proces. – Ace

+0

@Ace: Czy mówisz o programie Excel? To pytanie dotyczy programu Excel i jego wpływu na blokowanie plików. –

+1

To jest specyficzne dla systemu Windows, pytanie dotyczące programu Excel ma sens, ale nie w każdym scenariuszu będzie to prawda. Na przykład, jeśli wolumin jest podłączony do sieci, nie można stwierdzić, czy plik jest otwarty, jeśli spróbujesz tego na innym komputerze w sieci, w szczególności na serwerach lub klientach UNIX lub Linux. – Havok

3

Możesz użyć z open ("ścieżka") jako plik: tak, aby automatycznie się zamykał, w przeciwnym razie, jeśli jest otwarty w innym procesie, możesz spróbować jak w przykładzie Tims powinieneś użyć wyjścia IOError aby nie ignorować żadnego innego problemu z kodem :)

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

Nigdy nie rób 'except' bez określenia wyjątku, który chcesz przechwycić. Również zakres twojego bloku 'try' jest zbyt szeroki - Shansal chce sprawdzić, czy plik może być w ogóle otwarty. Obsługa błędów przy zapisie do pliku (lub cokolwiek innego dzieje się w bloku 'with') powinna być oddzielna. –

+0

dziękuję za wskazanie :) – thabubble

+0

Podobnie jak powyższa odpowiedź, nie ma to nic wspólnego z tym, o co prosił OP. –

28

Jeśli wszystko czego dbają o jest obecny proces, łatwym sposobem jest użycie atrybutu obiektu plik „zamknięty”

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

Nie wykryje to, czy plik jest otwarty przez inne procesy!

źródło: http://docs.python.org/2.4/lib/bltin-file-objects.html

+20

Atrybut '.closed' sprawdza, czy plik jest zamknięty przez bieżący proces Pythona. Nie sprawdza, czy plik jest otwarty lub zamknięty przez jakikolwiek inny proces. – temoto

+0

@Rmhero dzięki, szukałem tego – Veltro

+7

@Rmhero: Zastanów się nad usunięciem swojej odpowiedzi, ponieważ jest ona niepoprawna, może więc prowadzić do napisania kodu, który zachowuje się inaczej, niż zamierzał. Działa tak, jak opisuje @temoto. Aby to zobaczyć, otwórz dwie powłoki 'ipython', następnie' f = open ('foo.txt', 'w') 'w jednym, ale' f = open ('foo.txt', 'r') 'in inny. Wtedy 'f.closed jest False', ale' f.close() 'w drugim terminalu wystarcza, aby zmienić to w' f.closed jest True'. –

2

Żaden z pozostałych dostarczonych przykładów będzie pracować dla mnie, gdy do czynienia z tego konkretnego problemu z programu Excel w systemie Windows 10. Jedyna opcja mogłem pomyśleć było spróbować i zmienić nazwę pliku lub katalog zawierający plik tymczasowo, a następnie zmień jego nazwę.

import os 

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

To nie jest złe rozwiązanie, jeśli masz mało użytkowników do pliku ... to jest rzeczywiście rodzaj mechanizmu blokującego w prywatnym pliku. –

+0

Należy pamiętać, że jest to bardzo specyficzne dla systemu Windows, ponieważ większość innych systemów operacyjnych z przyjemnością zmieni nazwy plików, jeśli są już otwarte. – RandomInsano

Powiązane problemy