我目前使用shutil.copy2()
来复制大量的图像文件和文件夹(0.5至5演出之间的任何地方)。 Shutil
工作正常,但速度很慢。 我想知道是否有一种方法可以将这个信息传递给Windows来制作副本,并给我它的标准传输对话框。 你知道,这个人…
很多时候,我的脚本需要大约两倍于标准windows副本的时间,这让我感到紧张,我的Python解释器在运行副本时挂起。 我多次运行复制过程,我正在寻求缩短时间。
如果你的目标是一个奇特的复制对话框, SHFileOperation Windows API函数提供。 pywin32包有一个python绑定,ctypes也是一个选项(谷歌“SHFileOperation ctypes”的例子)。
这是我使用pywin32(非常轻微测试)的例子:
import os.path from win32com.shell import shell, shellcon def win32_shellcopy(src, dest): """ Copy files and directories using Windows shell. :param src: Path or a list of paths to copy. Filename portion of a path (but not directory portion) can contain wildcards ``*`` and ``?``. :param dst: destination directory. :returns: ``True`` if the operation completed successfully, ``False`` if it was aborted by user (completed partially). :raises: ``WindowsError`` if anything went wrong. Typically, when source file was not found. .. seealso: `SHFileperation on MSDN <http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx>` """ if isinstance(src, basestring): # in Py3 replace basestring with str src = os.path.abspath(src) else: # iterable src = '\0'.join(os.path.abspath(path) for path in src) result, aborted = shell.SHFileOperation(( 0, shellcon.FO_COPY, src, os.path.abspath(dest), shellcon.FOF_NOCONFIRMMKDIR, # flags None, None)) if not aborted and result != 0: # Note: raising a WindowsError with correct error code is quite # difficult due to SHFileOperation historical idiosyncrasies. # Therefore we simply pass a message. raise WindowsError('SHFileOperation failed: 0x%08x' % result) return not aborted
如果将上面的标志设置为shellcon.FOF_SILENT | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_NOERRORUI | shellcon.FOF_NOCONFIRMMKDIR.
也可以在“静音模式”下执行相同的复制操作(无对话框,无确认,无错误弹出窗口) shellcon.FOF_SILENT | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_NOERRORUI | shellcon.FOF_NOCONFIRMMKDIR.
详情请参阅SHFILEOPSTRUCT 。
请参阅IFileCopy 。 IFileOperation 可能会通过ctypes和shell32.dll,我不知道。
更新:请参阅
将它包裹在图书馆将是很好的…借助上述答案,我能够得到它在Windows 7上工作如下。
import pythoncom from win32com.shell import shell,shellcon def win_copy_files(src_files,dst_folder): # @see IFileOperation pfo = pythoncom.CoCreateInstance(shell.CLSID_FileOperation,None,pythoncom.CLSCTX_ALL,shell.IID_IFileOperation) # Respond with Yes to All for any dialog # @see http://msdn.microsoft.com/en-us/library/bb775799(v=vs.85).aspx pfo.SetOperationFlags(shellcon.FOF_NOCONFIRMATION) # Set the destionation folder dst = shell.SHCreateItemFromParsingName(dst_folder,None,shell.IID_IShellItem) for f in src_files: src = shell.SHCreateItemFromParsingName(f,None,shell.IID_IShellItem) pfo.CopyItem(src,dst) # Schedule an operation to be performed # @see http://msdn.microsoft.com/en-us/library/bb775780(v=vs.85).aspx success = pfo.PerformOperations() # @see sdn.microsoft.com/en-us/library/bb775769(v=vs.85).aspx aborted = pfo.GetAnyOperationsAborted() return success and not aborted files_to_copy = [r'C:\Users\jrm\Documents\test1.txt',r'C:\Users\jrm\Documents\test2.txt'] dest_folder = r'C:\Users\jrm\Documents\dst' win_copy_files(files_to_copy,dest_folder)
这里的参考也很有帮助: http : //timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/QuickStartClientCom.html