我编写了一个备份文件的脚本。但是我刚遇到一个问题。它很少是一个问题,但在这种情况下,我想防止异常行为。
脚本检查一个目录中的文件然后检入另一个目录,第一个中存在但第二个中不存在的任何文件都被复制,因此备份它们。
但是我刚试了一个要在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
结尾且不以~$
开头的文件。这解决了问题,因为它现在忽略了隐藏的文件!
答案 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"