检查文件是否在Python中打开

Sha*_*sal 53 python excel

在我的应用程序中,我写了一个excel文件.写完后,用户可以通过打开文件来查看该文件.但是,如果用户在进一步写入之前忘记关闭文件,则应显示警告消息.所以我需要一种方法来检查这个文件在写入过程之前是否打开.你能为我提供一些python代码来完成这项任务吗?

提前致谢.

小智 40

如果您关心的只是当前进程,一种简单的方法是使用文件对象属性"关闭"

f = open('file.py')
if f.closed:
  print 'file is closed'
Run Code Online (Sandbox Code Playgroud)

这不会检测文件是否被其他进程打开!

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

  • `.closed`属性检查当前Python进程是否关闭了文件.它不会检查文件是否由任何其他进程打开或关闭. (25认同)
  • @Rmhero:请考虑删除您的答案,因为它不正确,因此可能导致人们编写行为与预期不同的代码.它像@temoto描述的那样工作.要看到这个,只需打开两个`ipython` shell,然后在一个中打开`f = open('foo.txt','w')`,但是`f = open('foo.txt','r')`另一个.然后`f.closed是False',但是第二个终端中的`f.close()`足以将其转换为`f.closed为True`. (7认同)
  • @Ioannis Filippidis - 如果他没有给出答案,您将无法传达您的信息。宁可有他的信息和你的信息,而不是两者都没有。 (3认同)
  • 这正是我所需要的,并且在您进行文件操作时按预期工作,例如从网络抓取然后写入文件并想知道它何时完成以继续操作或向用户显示“完成” . 这是一个有价值的答案。 (3认同)

Tim*_*ker 38

我假设您正在写入文件,然后关闭它(因此用户可以在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()
Run Code Online (Sandbox Code Playgroud)

  • 它不起作用.我仍然可以通过另一个进程打开一个以'w +'开头的文件. (4认同)
  • 这是Windows特定的,问题是关于Excel然后它是有道理的,但不是在每个场景中都是如此.例如,如果卷已安装在网络中,则在网络上的另一台计算机(尤其是UNIX或Linux服务器或客户端)中尝试此操作时,无法知道该文件是否已打开. (3认同)

tha*_*ble 5

您可以使用with open("path") as file:它自动关闭,否则如果它在另一个进程中打开,您可以尝试像 Tims 示例一样,您应该使用 except IOError 来不忽略代码中的任何其他问题:)

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

  • 切勿在未指定要捕获的异常的情况下执行“ except ”。另外,你的“try”块的范围太宽了 - Shansal 想要检查文件是否可以打开。写入文件时的错误处理(或“with”块中发生的任何其他事情)应该是分开的。 (10认同)

小智 5

当我在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.')
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是 Windows 特有的,因为如果文件已经打开,大多数其他操作系统会很乐意重命名文件。 (4认同)