Подтвердить что ты не робот

Проверить, открыт ли файл в Python

В моем приложении я пишу в файл Excel. После записи пользователь может просмотреть файл, открыв его. Но если пользователь забывает закрыть файл перед дальнейшей записью, должно появиться предупреждающее сообщение. Поэтому мне нужен способ проверить, открыт ли этот файл перед процессом записи. Не могли бы вы предоставить мне немного кода Python для выполнения этой задачи?

4b9b3361

Ответ 1

Я предполагаю, что вы пишете файл, затем закройте его (чтобы пользователь мог открыть его в Excel), а затем, прежде чем повторно открыть его для операций добавления/записи, вы хотите проверить, что файл isn 't все еще открыт в Excel?

Вот как вы должны это делать:

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

Если все, о чем вы заботитесь, это текущий процесс, простой способ - использовать атрибут файлового объекта "закрытый"

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

Это не будет определять, открыт ли файл другими процессами!

источник: http://docs.python.org/2.4/lib/bltin-file-objects.html

Ответ 3

Ни один из других приведенных примеров не будет работать для меня, когда вы сталкиваетесь с этой конкретной проблемой с excel на Windows 10. Единственный другой вариант, о котором я мог подумать, - это попробовать переименовать файл или каталог, содержащий файл, временно, а затем переименовать его назад.

import os

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

Ответ 4

Вы можете использовать с открытым ( "путь" ) в качестве файла: чтобы он автоматически закрывался, иначе, если он открывается в другом процессе, вы можете попробовать как в примере с Tims, вы должны использовать, кроме IOError, чтобы не игнорировать другие проблемы с вашим кодом:)

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

Ответ 5

Использование

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

может вызвать некоторые проблемы, когда файл открывается другими процессами (то есть пользователь открыл его вручную). Вы можете решить свою проблему, используя библиотеку win32com. Приведенный ниже код проверяет, открыты ли какие-либо файлы Excel и если ни один из них не совпадает с именем вашего конкретного файла, открывает новый.

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'

Надеюсь, это поможет