7

言うためのPython 2のドキュメントfilecmp()

浅いが指定されていて false でない限り、同一os.stat()の署名を持つファイルは等しいと見なされます。

署名を除いて同一である 2 つのファイルはos.stat()等しくないと見なされるように聞こえますが、次のコード スニペットを実行して示すように、そうではないようです。

import filecmp
import os
import shutil
import time

with open('test_file_1', 'w') as f:
    f.write('file contents')
shutil.copy('test_file_1', 'test_file_2')
time.sleep(5)  # pause to get a different time-stamp
os.utime('test_file_2', None)  # change copied file's time-stamp

print 'test_file_1:', os.stat('test_file_1')
print 'test_file_2:', os.stat('test_file_2')
print 'filecmp.cmp():', filecmp.cmp('test_file_1', 'test_file_2')

出力:

test_file_1: nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0,
  st_uid=0, st_gid=0, st_size=13L, st_atime=1320719522L, st_mtime=1320720444L, 
  st_ctime=1320719522L)
test_file_2: nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, 
  st_uid=0, st_gid=0, st_size=13L, st_atime=1320720504L, st_mtime=1320720504L, 
  st_ctime=1320719539L)
filecmp.cmp(): True

ご覧のとおり、2 つのファイルのタイム スタンプ ( st_atimest_mtime、およびst_ctime) は明らかに同じではありませんが、2 つのファイルfilecmp.cmp()が同一であることを示しています。私は何かを誤解していますかfilecmp.cmp()、それとも の実装またはドキュメントにバグがありますか?

アップデート

Python 3 のドキュメントshallowは言い換えられており、現在次のように述べられています。これは、が True の場合でも異なるタイムスタンプを持つファイルが等しいと見なされる可能性があることをより適切に意味するという意味でのみ改善されています。

浅いが真の場合、同一のos.stat()署名を持つファイルは等しいと見なされます。それ以外の場合は、ファイルの内容が比較されます。

FWIW私は、次のようなことを単純に言ったほうがよかったと思います:

浅いが真の場合、os.stat() 署名が等しくない場合にのみファイルの内容が比較されます 。

4

2 に答える 2

8

ドキュメントを誤解しています。行#2は次のように述べています:

浅いが指定されていて false でない限り、同一os.stat()の署名を持つファイルは等しいと見なされます。

同一os.stat()の署名を持つファイルは等しいと見なされますが、論理的な逆は真ではありません。異なるos.stat()署名を持つファイルは、必ずしも等しくないと見なされるわけではありません。むしろ、それら等しくない可能性があり、その場合、実際のファイルの内容が比較されます。ファイルの内容が同一であることが判明したため、 をfilecmp.cmp()返しますTrue

3番目の節に従って、ファイルが等しいと判断すると、その結果をキャッシュし、同じファイルを再度比較するように要求した場合、それらのファイルの構造が変わらない限り、ファイルの内容を再読み取りする必要はありません。os.stat変更

于 2011-11-08T05:20:42.367 に答える
1

「自分で転がす」ことは、確かに望ましい結果を生み出すために必要なことのようです。何気ない読者がその結論に達するのに十分なほど文書が明確であるならば、それは単に素晴らしいでしょう。

現在使用している関数は次のとおりです。

def cmp_stat_weak(a, b):
    sa = os.stat(a)
    sb = os.stat(b)
    return (sa.st_size == sb.st_size and sa.st_mtime == sb.st_mtime)
于 2013-01-30T18:10:19.543 に答える