web-dev-qa-db-ja.com

ファイルがPython

私のアプリでは、Excelファイルに書き込みます。書き込み後、ユーザーはファイルを開いて表示できます。ただし、ユーザーがさらに書き込む前にファイルを閉じるのを忘れると、警告メッセージが表示されます。したがって、プロセスを書き込む前に、このファイルが開いていることを確認する方法が必要です。このタスクを実行するためのコードをpythonコードで提供してもらえますか?

前もって感謝します。

50
Shansal

私はあなたがファイルに書き込み、それを閉じて(ユーザーがExcelで開くことができるように)、追加/書き込み操作のために再び開く前に、ファイルがまだないことを確認したいと思います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()
38
Tim Pietzcker

気になるのが現在のプロセスだけである場合、簡単な方法はファイルオブジェクト属性「closed」を使用することです

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

これは、ファイルが他のプロセスによって開かれているかどうかを検出しません!

ソース: http://docs.python.org/2.4/lib/bltin-file-objects.html

39
Rmhero

Windows 10でExcelを使用してこの特定の問題に対処する場合、提供されている他の例はどれもうまくいきません。他に考えられる唯一のオプションは、ファイルまたはファイルを含むディレクトリの名前を一時的に変更してから、名前を変更することでした。

import os

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

ファイルとしてopen( "path")で使用できます:自動的に閉じるため、他のプロセスで開いている場合は、コードの他の問題を無視しないようにIOError以外を使用するTimsの例のように試すことができます。

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

を使用して

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'

これが役立つことを願って

0
jabba