防止脚本在权限错误时崩溃

时间:2014-09-04 13:02:20

标签: python python-2.x

我编写了一个备份文件的脚本。但是我刚遇到一个问题。它很少是一个问题,但在这种情况下,我想防止异常行为。

脚本检查一个目录中的文件然后检入另一个目录,第一个中存在但第二个中不存在的任何文件都被复制,因此备份它们。

但是我刚试了一个要在excel中打开的文件,脚本返回错误:

IOError: [Errno 13] Permission denied: 'C:\\dev\\DailyStatistics\\September\\~$Update Rates 050914.xlsx'

我希望那是因为它当时是开放的。

如何修改我的脚本,以便在发生这种情况时调用此命令:

print "One or more of the files you tried to backup were open. Please save and close the document and try again"

这是复制文件的脚本部分:

for file in source_files:
filename = file[-11:-1]
year = filename[-6:-4]
foldername = directory_mapping[filename[-8:-6]]
if not os.path.exists("W://20" + year + '/' + foldername + "/"):
    os.makedirs("W://20" + year + '/' + foldername + '/')
if filename not in bfiles:
    shutil.copy(file, 'W://20' + year + '/' + foldername + '/')
    files_transferred = files_transferred + 1

编辑:

John Zwinck在下面的回答确实有效。然而,我对问题的看法更深入,并意识到在提高错误的同时,实际上已经传输了文件。

我从备份位置删除了所有文件,然后打开了2个源文件来测试try / except块。

除了工作,我收到了2条错误消息,但在关闭文档并再次尝试之前,我检查了目标文件,两个文件都在正确的大小。

如果文件实际传输正确,为什么python会抛出此错误。

更新:

上述问题的原因是因为Windows锁定文件的方式。 Excel打开时会创建一个隐藏文件。因为这个文件也与它试图复制的模式相匹配。

错误被隐藏在" temp"文件而不是实际打开的文件。

为了解决这个问题,我更改了匹配方法。

现在只匹配以.xlsx结尾且不以~$开头的文件。这解决了问题,因为它现在忽略了隐藏的文件!

2 个答案:

答案 0 :(得分:2)

try:
    shutil.copy(file, 'W://20' + year + '/' + foldername + '/')
except IOError as ex:
    print ex, "Please save and close the document and try again"

答案 1 :(得分:0)

使用try-except块:

try:
    shutil.copy(file, 'W://20' + year + '/' + foldername + '/')
except IOError:
    print "One or more of the files you tried to backup were open. Please save and close the document and try again"