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?
Antworten
Zu viele Anzeigen?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
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()
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.')
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
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.")
- See previous answers
- Weitere Antworten anzeigen