Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 filecmp.cmp返回false,即使gzip文件相同_Python_Gzip_Fastq_Cmp_File Comparison - Fatal编程技术网

Python 2.7 filecmp.cmp返回false,即使gzip文件相同

Python 2.7 filecmp.cmp返回false,即使gzip文件相同,python,gzip,fastq,cmp,file-comparison,Python,Gzip,Fastq,Cmp,File Comparison,我正在比较一堆fastq.gz文件。每个文件都是~4G: if filecmp.cmp(f1,f2,shallow=False) 它返回false,因为f1和f2不同。但是当我使用diff/comm比较文件时,我得到0输出(我解压缩然后比较)。我试了两种方法。 我试图打印出差异,但内存不足 diff=difflib.ndiff((gzip.open(f1)).readlines(),(gzip.open(f2)).readlines()) print [i for i in diff if i

我正在比较一堆fastq.gz文件。每个文件都是~4G:

if filecmp.cmp(f1,f2,shallow=False)
它返回false,因为f1和f2不同。但是当我使用diff/comm比较文件时,我得到0输出(我解压缩然后比较)。我试了两种方法。 我试图打印出差异,但内存不足

diff=difflib.ndiff((gzip.open(f1)).readlines(),(gzip.open(f2)).readlines())
print [i for i in diff if i.startswith('+')]
是因为文件被压缩了吗?有没有关于如何在不解压缩的情况下进行比较的想法?(每个文件有200M行)


谢谢大家!

通常,您需要比较未压缩的输出。这是确定两个gzip文件是否具有相同未压缩内容的唯一方法。它们可以用不同的压缩级别或不同的gzip软件进行压缩,得到不同的压缩结果。唯一的保证是当你压缩然后解压时,你会得到原始的输入。没有任何保证,当你解压,然后压缩,你得到原始输入

如果您控制gzip进程,使用相同的代码、相同的压缩级别和其他选项,您仍然可以获得不同的输出,因为标题内容不同。标题可能具有不同的时间戳、不同的文件名或其他变体。在这种情况下,您可以跳过每个标题的标题(作为标题结束的指南),然后比较每个标题的其余部分。给定所述条件,两个文件的其余部分将是相同的


如果您控制压缩,并且知道每个gzip文件由一个gzip成员组成,那么您可以做的另一件事是检查每个文件的最后八个字节。如果这些不相同,则压缩数据不同。如果它们相同,则内容可能相同,因此您需要解压缩和比较,或者使用上述方法。这可以节省大量时间,几乎不必比较具有不同未压缩内容的gzip文件。最后八个字节是未压缩数据的四字节CRC,以及未压缩数据的长度模数232。

非常感谢@Mark。实际上,我对gzipping过程没有任何控制权。你对如何解压缩和比较这些文件有什么建议吗?(除了gzip。打开每一个并逐行循环…)我可以用filecmp来做吗?如果你只是想确定它们是相同的还是不同的,我不会用diff或逐行读取来做这件事。diff在维护历史记录以查找匹配数据时会消耗大量内存。如果长时间没有新行,逐行可能会消耗内存,这很容易在二进制数据中发生。您应该读取和解压缩两个gzip文件,并逐字节比较二进制结果。一旦看到任何差异,就停止并中止两次解压缩。如果你坚持到底,那么两者是相同的。