复制带有校验和的文件
Copy a file with checksum
我创建了一个函数,将文件从目录 A 复制到 B,并在删除 A 之前比较两个校验和。
现在我重新发明了轮子。 我想知道如何才能做得更好。而不是使用 shutil
和 hashlib
.
实现新的 safe_copy()
- 在 python 中是否已经有图书馆这样做了?
- 是否已经有 Windows 内置函数?
- 任何内置的蟒蛇?
信息:
- 我无法安装第 3 方代码,我正在离线服务器上工作。
- 性能不是问题
- 我必须复制的文件路径在 pandas DataFrame(origin, destination)
中给出
这个问题不是关于性能的(但这总是一个很好的提出点),而是关于一般的代码重用。
对于任何刚起步的程序员来说,深入研究您感兴趣的东西绝对是有意义的 - 如果您的情况是文件管理,那当然很好。请记住,Python 根本不是最终严重依赖性能的最佳语言。如果您热衷于学习 C++ 或 Rust 这样的语言,可能更有意义。
如果您确实想在 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
文件,显然不要只 运行 这个脚本)
存在数以千计的文件管理实用程序,这些实用程序已经开发了几十年,并且针对速度或非常具体的功能进行了高度优化。在几乎任何现实世界的项目中,combine/package 几个这样的项目并使用批处理语言(或者可能 Python)将它们编写在一起比从头开始重写它们更有意义。
重写对于更多地了解它们的内部工作原理是有意义的,但是一旦您理解了它们,您可能会发现自己放弃了这项工作。重写的另一个原因可能是因为您对如何做得更好有一个聪明的想法,但这几乎可以保证其他语言的表现优于 Python.
后续评论:据我所知,Windows 中没有一个实用程序可以一次性完成 'safe-copy'。我认为这主要是因为如果出现问题,您几乎可以依赖 robocopy
(标准 Windows)等实用程序来失败,并且如果没有错误地完成,请放心您的副本是好的。
但是,我可以理解想要更加确定,因此将 robocopy
之类的内容与 PowerShell 中的 Get-FileHash
之类的 cmdlet 串在一起会相当简单。 PowerShell 也是 Windows 的标准部分,编写 .ps1 脚本并不比编写批处理文件复杂多少。一个简单的“复制此文件,获取并比较 filehas 并根据结果删除适当的文件”-PowerShell 脚本只有几行,无需安装。
我创建了一个函数,将文件从目录 A 复制到 B,并在删除 A 之前比较两个校验和。
现在我重新发明了轮子。 我想知道如何才能做得更好。而不是使用 shutil
和 hashlib
.
safe_copy()
- 在 python 中是否已经有图书馆这样做了?
- 是否已经有 Windows 内置函数?
- 任何内置的蟒蛇?
信息:
- 我无法安装第 3 方代码,我正在离线服务器上工作。
- 性能不是问题
- 我必须复制的文件路径在 pandas DataFrame(origin, destination) 中给出
这个问题不是关于性能的(但这总是一个很好的提出点),而是关于一般的代码重用。
对于任何刚起步的程序员来说,深入研究您感兴趣的东西绝对是有意义的 - 如果您的情况是文件管理,那当然很好。请记住,Python 根本不是最终严重依赖性能的最佳语言。如果您热衷于学习 C++ 或 Rust 这样的语言,可能更有意义。
如果您确实想在 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
文件,显然不要只 运行 这个脚本)
存在数以千计的文件管理实用程序,这些实用程序已经开发了几十年,并且针对速度或非常具体的功能进行了高度优化。在几乎任何现实世界的项目中,combine/package 几个这样的项目并使用批处理语言(或者可能 Python)将它们编写在一起比从头开始重写它们更有意义。
重写对于更多地了解它们的内部工作原理是有意义的,但是一旦您理解了它们,您可能会发现自己放弃了这项工作。重写的另一个原因可能是因为您对如何做得更好有一个聪明的想法,但这几乎可以保证其他语言的表现优于 Python.
后续评论:据我所知,Windows 中没有一个实用程序可以一次性完成 'safe-copy'。我认为这主要是因为如果出现问题,您几乎可以依赖 robocopy
(标准 Windows)等实用程序来失败,并且如果没有错误地完成,请放心您的副本是好的。
但是,我可以理解想要更加确定,因此将 robocopy
之类的内容与 PowerShell 中的 Get-FileHash
之类的 cmdlet 串在一起会相当简单。 PowerShell 也是 Windows 的标准部分,编写 .ps1 脚本并不比编写批处理文件复杂多少。一个简单的“复制此文件,获取并比较 filehas 并根据结果删除适当的文件”-PowerShell 脚本只有几行,无需安装。