【问题标题】:Copy a file with checksum复制带有校验和的文件
【发布时间】:2020-11-13 11:02:33
【问题描述】:

我创建了一个函数,将文件从目录 A 复制到 B,并在删除 A 之前比较两个校验和。

现在我重新发明了轮子。 我想知道如何才能做得更好。而不是用shutilhashlib 实现一个新的safe_copy()

  • 是否已经有库在 python 中做这件事?
  • 是否已经有 Windows 内置程序?
  • 任何内置 anaconda 的东西?

信息:

  • 我无法安装第 3 方代码,我正在离线服务器上工作。
  • 性能不是问题
  • 我必须复制的文件的路径在 pandas DataFrame(origin, destination) 中给出

这个问题不是关于性能的问题(但这总是一个很好的问题),而是关于一般的代码重用。

【问题讨论】:

  • 当有数百个命令行实用程序可以解决这个问题时,您为什么要尝试使用 Python 脚本来执行此操作?就像您说的那样,您似乎仍然一心想要重新发明轮子?
  • 我问是因为我还是一个年轻而愚蠢的开发者。我只有不到一年的时间,在那一年里,我没有从长辈那里得到太多建议(工作太多)。你会推荐我用什么?我更新了问题... ;)

标签: python copy checksum


【解决方案1】:

对于任何初级程序员来说,深入研究你感兴趣的东西绝对是有意义的——如果,在你的情况下,那是文件管理,那当然没问题。请记住,对于最终严重依赖性能的东西来说,Python 根本不是一种最佳语言。如果您有兴趣,学习 C++ 或 Rust 之类的语言可能更有意义。

如果您确实想继续使用 Python 进行开发,您绝对应该通读标准模块 osshutilpathlibhashlib。您描述的程序可能很简单:

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(标准 Windows)之类的实用程序在出现问题时失败,并确保您的副本在没有错误的情况下完成。

但是,我希望能够更加确定,因此将 robocopy 之类的内容与来自 PowerShell 的 Get-FileHash 之类的 cmdlet 一起串起来相当简单。 PowerShell 也是 Windows 的标准部分,编写 .ps1 脚本并不比编写批处理文件复杂多少。一个简单的“复制此文件,获取并比较文件,并根据结果删除适当的文件”-PowerShell 脚本只需几行,无需安装。

【讨论】:

  • 我重新格式化了这个问题,很抱歉造成混乱。如果您知道 (windows/python/anything else) 内置命令来执行 safe_copy(如果我们可以选择散列,则加分),为了完整起见,我会等着让您编辑您的答案。但我已经准备好接受了。非常感谢您的建议。
  • 我在 PowerShell 中添加了一些关于 robocopyGet-FileHash 的评论。
猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
相关资源
最近更新 更多