76 Stimmen

prüfen, ob eine Datei in Python geöffnet ist

In meiner Anwendung schreibe ich in eine Exceldatei. Nach dem Schreiben kann der Benutzer die Datei anzeigen, indem er sie öffnet. Wenn der Benutzer jedoch vergisst, die Datei vor dem weiteren Schreiben zu schließen, sollte eine Warnmeldung erscheinen. Ich brauche also eine Möglichkeit, um zu prüfen, ob die Datei vor dem Schreibvorgang geöffnet ist. Könnten Sie mir einen Python-Code zur Verfügung stellen, der diese Aufgabe erfüllt?

70voto

Rmhero Punkte 707

Wenn Sie sich nur für den aktuellen Prozess interessieren Eine einfache Möglichkeit ist die Verwendung des Dateiattributs "closed".

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

Dabei wird nicht erkannt, ob die Datei von anderen Prozessen geöffnet ist!

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

58voto

Tim Pietzcker Punkte 311448

Ich nehme an, dass Sie in die Datei schreiben, sie dann schließen (damit der Benutzer sie in Excel öffnen kann) und dann, bevor Sie sie für Anhänge-/Schreibvorgänge wieder öffnen, überprüfen möchten, ob die Datei nicht noch in Excel geöffnet ist?

So könnten Sie das tun:

while True:   # repeat until the try statement succeeds
    try:
        myfile = open("myfile.csv", "r+") # or "a+", whatever you need
        break                             # exit the loop
    except IOError:
        input("Could not open file! Please close Excel. Press Enter to retry.")
        # restart the loop

with myfile:
    do_stuff()

8voto

DoubleD Punkte 71

Nur für Windows

Keines der anderen Beispiele hat bei mir funktioniert, wenn es um dieses spezielle Problem mit Excel unter Windows 10 ging. Die einzige andere Möglichkeit, die mir einfiel, war zu versuchen, die Datei oder das Verzeichnis, in dem sich die Datei befindet, vorübergehend umzubenennen und sie dann wieder zurückzubenennen.

import os

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

5voto

thabubble Punkte 620

Sie könnten verwenden with open("path") as file: so dass er automatisch geschlossen wird, oder wenn er in einem anderen Prozess geöffnet ist, können Sie vielleicht versuchen wie in Tims Beispiel sollten Sie except IOError verwenden, um kein anderes Problem mit Ihrem Code zu ignorieren :)

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

3voto

Versuchen Sie diese Methode, wenn die oben genannten Methoden Ihre Excel-Datei beschädigen.

Diese Funktion versucht, die Datei in ihren eigenen Namen umzubenennen. Wenn die Datei bereits geöffnet ist, wird die Bearbeitung vom Betriebssystem zurückgewiesen und eine OSError-Exception ausgelöst. Sie berührt nicht den inneren Code, so dass Ihre Excel-Dateien nicht beschädigt werden. LMK wenn es für Sie funktioniert hat.

def check_file_status(self):
try:
    os.rename("file1.xlsx", "file1.xlsx")
    print("File is closed.")
except OSError:
    print("File is opened.")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X