Python 用校验和复制文件
我创建了一个函数,将文件从dira复制到B,并在删除a之前比较两个校验和 现在我已经重新发明了轮子。我想知道我怎么能做得更好。而不是使用Python 用校验和复制文件,python,copy,checksum,Python,Copy,Checksum,我创建了一个函数,将文件从dira复制到B,并在删除a之前比较两个校验和 现在我已经重新发明了轮子。我想知道我怎么能做得更好。而不是使用shutil和hashlib实现新的safe\u copy() 已经有库在python中运行了吗? 是否已经有内置的Windows? 有内置的蟒蛇吗? 信息: 我无法安装第三方代码,我正在脱机服务器上工作 性能不是问题 我必须复制的文件路径在数据框中给出(源、目标) 这个问题不是关于性能(但这始终是一个很好的观点),而是关于一般的代码重用。对于任何一个刚
shutil
和hashlib
实现新的safe\u copy()
- 已经有库在python中运行了吗?
- 是否已经有内置的Windows?
- 有内置的蟒蛇吗?
- 我无法安装第三方代码,我正在脱机服务器上工作
- 性能不是问题
- 我必须复制的文件路径在数据框中给出(源、目标)
这个问题不是关于性能(但这始终是一个很好的观点),而是关于一般的代码重用。对于任何一个刚开始的程序员来说,深入研究您感兴趣的东西肯定是有意义的——如果您感兴趣的是文件管理,那当然可以。请记住,对于最终严重依赖性能的东西来说,Python根本不是一种最佳语言。像C++或者生锈这样的语言,如果你喜欢它,那就更有意义了。 如果您确实希望继续使用Python开发此功能,那么一定要通读标准模块
os
、shutil
、pathlib
和hashlib
。您描述的程序可以简单到:
from pathlib import Path
from shutil import copyfile
from hashlib import md5
from os import remove
def file_md5(fname):
chunk_size = 16384 # arbitrary
md5_hash = md5()
with open(fname, 'rb') as f:
for chunk in iter(lambda: f.read(chunk_size), b''):
md5_hash.update(chunk)
return md5_hash.hexdigest()
a = 'C:\temp\a.txt'
b = 'C:\temp\b.txt'
if Path(b).is_file():
print('that file already exists!')
exit(1)
else:
copyfile(a, b)
if file_md5(a) != file_md5(b):
print('something is not the same')
else:
remove(a)
(显然,如果您有一个实际的C:\temp\a.txt
文件,不要只运行此脚本)
有成千上万的文件管理实用程序,它们已经开发了几十年,并且在速度或非常特定的功能方面得到了高度优化。在几乎任何现实世界的项目中,使用批处理语言(或者Python)组合/打包其中的几个并编写脚本比从头重写它们更有意义
重写有助于更多地了解它们的内部工作方式,但一旦理解了它们,您可能会发现自己放弃了工作。重写的另一个原因可能是因为您对如何更好地完成它有一个聪明的想法,但这就是其他语言几乎可以保证优于Python的地方
后续评论:据我所知,Windows中没有一个单一的实用程序可以一次性完成“安全拷贝”。我认为这主要是因为,如果出现问题,您几乎可以依赖于像robocopy
(标准窗口)这样的实用程序失败,并且如果您的副本完成时没有错误,请放心,您的副本是好的
但是,我希望能够更加确定,因此将
robocopy
之类的内容与来自PowerShell的Get-FileHash
之类的cmdlet串在一起会非常简单。PowerShell也是Windows的标准部分,编写.ps1脚本并不比编写批处理文件复杂多少。一个简单的“复制此文件,获取并比较文件并根据结果删除相应的文件”-PowerShell脚本只需几行,无需安装。当有数百个命令行实用程序可以解决此问题时,您为什么要尝试使用Python脚本执行此操作?我问你是因为我还是一个年轻而愚蠢的开发人员。我只有一年的时间,在这一年里,我没有从我的长辈那里得到太多的建议(太多的工作)。你推荐我用什么?我更新问题…;)我重新编排了问题的格式,抱歉弄乱了。如果您知道(windows/python/anythis)内置命令可以进行安全复制(如果我们可以选择散列,那么还有一点好处),为了完整起见,我将等待您对答案进行编辑。但我已经接受了。非常感谢您的建议。我添加了一些关于PowerShell中的robocopy
和Get FileHash
的评论。