写一个小工具,用途是从CDN和samba上下载两批文件,然后对比两批文件的MD5值,以确定上传到CDN的文件是不是确实是samba上的。
编程结束,测试发现,24个文件总有固定的3个文件比对MD5值失败。重复多次均是这3个文件比对失败。然后用MD5小工具单独比对出错文件时,两边的MD5又一样。所以怀疑下载好的文件是正确的,MD5加密算法有问题。
MD5算法是采用分块计算每个块生成str1,然后再计算str1的MD5的方式。又怀疑是用了stringIO导致读取文件时读取的缓存不对,所以将StingIO去掉换成变量赋值的方式,现象依旧。
没办法只好将第一次计算MD5的字符串和第二次计算MD5的字符串分别打印出来比对,发现只有最后一块计算出来的MD5值不正确,前两块计算出的MD5值正确。那么说明算法没有问题,是最后一个块读取出的数据的问题。
怎么确定最后的数据哪里不一致呢?一开始以为是读的时候没有正确的发现EOF标志,所以又加日志,在计算最后一块数据的MD5时,输出当前计算的数据到文件。比对情况如下图
发现最后一块数据的最后几百个字节没有读出来,这三个出错文件均是这种情况。不解,所以又在读取完每一块的时候输出当前的游标值。
发现果然你妹的没有把最后一块数据读完全就去计算MD5了有木有!!又尝试着运行了一遍最初的代码,发现出错的文件变成另外三个了,并且将整个计算MD5的文件拷贝出来单独调用计算,没有问题!!这说明还是跟下载有关。
在将计算MD5值的函数单独出来调用时,不小心发现,在从samba server下载文件的时候,脚本已经运行完毕了,但是下载的文件有个别的仍然被脚本shell占用着,并且文件大小是上图中的9478144bytes。当关闭脚本shell后,变成了真正的大小9481600bytes!!这不就清楚了么。
真相只有一个!
那就是我在从samba server下载文件后没有手动关闭文件,这样做的结果是,系统会帮你关掉一部分可以关掉的文件,但是有一部分恰巧被shell占用了,没有成功关掉的,那么就会继续被shell占用着,如下图
总结:警惕这种低级错误,警惕一个脚本写一个礼拜,中间断断续续的结果就是你以为你写进去了,但实际你没有写进去,犯了唯物主义错误。
相关推荐
Python的另一个强大领域是网络编程,你将了解到如何使用HTTP库如requests发送网络请求,以及使用socket进行低级网络通信。 Python的另一大亮点是其强大的Web开发框架,如Django和Flask。在教程的后期,你可能会接触...
Python 3.5.2是Python编程语言的一个稳定版本,发布于2016年,它带来了许多新特性和改进。官方API文档是开发者的重要参考资料,涵盖了语言语法、标准库、模块以及内置函数等所有方面。以下是这个版本的一些关键知识...
《Python学习手册(第三版)》是一本针对Python编程语言的详尽教程,包含了Python的基础知识和高级特性,旨在帮助初学者和有一定经验的开发者深入理解Python编程。这本书结合了中文译本和英文原版,使得读者可以根据...
在《强大的Python-完全用Python工作》中,作者阐述了Python作为一种通用编程语言的广泛适用性和优势...然而,每种语言都有其适用场景,Python并不意味着适用于所有情况,但对于大部分日常工作,Python无疑是首选之一。
以上只是Python 3.8.6 API手册中的一部分核心概念,实际手册还包含了更详细的函数文档、示例代码和编程指南,对于深入学习和使用Python编程具有极高的价值。通过阅读和实践,开发者能够熟练掌握Python的特性和最佳...
- Python的版本发展:从Python 1.0引入函数式工具,到Python 2.0的列表推导式,再到Python 3.0的重大更新,每个版本都在不断进化和完善。 - Python的特性: 1) 简单易学:Python的语法简洁明了,易于理解和学习。 ...
C语言是一种低级语言,它的运行效率高,可以直接对硬件进行操作,因此在系统编程、嵌入式开发等领域广泛应用。C语言中的算法学习对于理解计算机底层工作原理和数据结构有极大的帮助。这个资源中的C语言实例涵盖了...
- **用途**: 当需要遍历大量数据但不想一次性加载所有数据到内存时,生成器是非常有用的。 - **示例**: ```python def simple_generator(): yield 1 yield 2 yield 3 for value in simple_generator(): ...
7. 健壮性(Robustness):健壮的Python算法能应对异常和错误数据,提供良好的错误处理机制。Python的异常处理结构(try/except)可以帮助我们编写更稳定、可靠的代码。 除了这些基本特性,Python算法还涉及到时间和...
标题 "一个存储库算法在C C Python和Java.zip" 提示我们这个压缩包包含了一些关于在C、C++、Python和Java编程语言中实现的算法。这些算法可能涵盖排序、搜索、图论、数据结构等多个领域,是学习和比较不同语言处理...
3. **XlsxWriter库**:当需要创建新Excel文件或者写入数据到现有Excel文件时,XlsxWriter提供了一个高效的低级接口,避免了Pandas写入大文件时的内存问题。你可以先创建一个工作簿,然后逐个工作表添加数据。 4. **...
在“LearningPython:跟踪我在Python中的进度”这个项目中,我们可以看到一个名为“LearningPython-main”的压缩包,这很可能是某个人学习Python的过程记录或学习资源的集合。在这个过程中,通常会包含源代码、笔记...
列表推导式和生成器表达式是Python中高效处理数字序列的利器,它们可以快速生成新的序列,例如:[x * x for x in range(10)]会生成一个包含0到9平方的列表。 Python的控制流结构如for循环和if条件语句也是处理数字...
Python的标准库还包括一个强大的异常处理机制,通过try/except/finally语句来捕获和处理程序运行时可能出现的错误。此外,Python的模块化设计允许程序员将代码组织成独立的模块,便于代码重用和项目管理。 在网络...
在Python编程中,`h5py`库是一个用于读写HDF5文件的强大工具,它提供了与Python字典类似的接口来访问数据。然而,在不同版本的Python之间,使用`h5py`操作HDF5文件时,特别是获取文件中keys的方法会有所不同,这可能...
Python是一种高级编程语言,以其简洁明了的语法和强大的功能深受开发者喜爱,但在处理大量数据或需要高性能计算时,Python的执行速度相比其他低级语言(如C++或Java)可能会显得较慢。然而,通过一些策略和技巧,...
其中,语法分析是编译器设计的关键步骤之一,它解析源代码并构建出抽象语法树(AST)。递归下降语法分析是一种常见的自顶向下的语法分析方法,其原理和实现是本次实验的核心内容。 递归下降分析方法基于程序的函数...
4. **列表推导式和生成器**:Python的列表推导式可以快速创建新列表,而生成器则允许你在需要时生成值,节省内存。这些在处理大量数据时非常有用。 5. **异常处理**:通过try-except语句捕获和处理错误,可以使你的...