Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでファイルを比較する方法


問題。

Pythonでファイルを比較する必要があります。

解決策..

Pythonのfilecmpモジュールを使用して、ファイルとディレクトリを比較できます。 1.

cmp(file1, file2[, shallow])

filecmpファイルfile1とfile2を比較し、同一の場合はTrueを返し、そうでない場合はFalseを返します。デフォルトでは、os.stat()によって返されるものと同じ属性を持つファイルは等しいと見なされます。浅さが提供されていない(またはTrueである)場合、同じ統計署名を持つファイルは等しいと見なされます。

cmpfiles(dir1, dir2, common[, shallow])

2つのディレクトリdir1とdir2に共通のリストに含まれているファイルの内容を比較します。 cmpfilesは、ファイル名の一致、不一致、エラーの3つのリストを含むタプルを返します。

  • match-両方のディレクトリで同じファイルを一覧表示します。

  • 不一致-一致しないファイルを一覧表示します。

  • エラー-何らかの理由で比較できなかったファイルを一覧表示します。

dircmp(dir1, dir2 [, ignore[, hide]])

ディレクトリdir1およびdir2でさまざまな比較操作を実行するために使用できるディレクトリ比較オブジェクトを作成します。

  • 無視-無視するファイル名のリストを無視します。デフォルト値は['RCS'、'CVS'、'tags']です。

  • hidden-非表示にするファイル名のリスト、デフォルトのリスト[os.curdir、os.pardir](UNIXでは['。'、'..']。

filecmp.dircmpのインスタンスは、詳細なレポートをsys.stdoutに出力する次のメソッドを実装します。

  • report():2つのディレクトリ間の比較を出力します。

  • report_partial_closure():2つのディレクトリと、2つのdirectories.

  • report_full_closure():2つのディレクトリ、それらのすべてのサブディレクトリ、those subdirectories, and so on (i.e., recursively).

  • left_list:ディレクトリpath1で見つかったファイルとサブディレクトリで、hidelistの要素は含まれていません。

  • right_list:ディレクトリpath2にあるファイルとサブディレクトリで、hidelistの要素は含まれていません。

  • 共通:ディレクトリpath1とディレクトリpath2の両方にあるファイルとサブディレクトリ。

  • left_only:ディレクトリpath1のみにあるファイルとサブディレクトリ。

  • right_only:ディレクトリpath2のみにあるファイルとサブディレクトリ。

  • common_dirs:ディレクトリpath1とディレクトリpath2の両方にあるサブディレクトリ。

  • common_files:ディレクトリpath1とディレクトリpath2の両方にあるファイル。

  • same_files:ディレクトリpath1とディレクトリpath2の両方で内容が同じであるファイルへのパス。

  • diff_files:ディレクトリpath1とディレクトリpath2の両方にあるが、内容が異なるファイルへのパス。

  • Funny_files:ディレクトリpath1とディレクトリpath2の両方にあるが、何らかの理由で比較できなかったファイルへのパス。

  • subdirs:common_dirsの名前をdircmpオブジェクトにマップする辞書。

比較のためのテストデータの準備。

import os
# prepare test data
def makefile(filename,text=None):
"""
Function: make some files
params : input file, body
"""

with open(filename, 'w') as f:
f.write(text or filename)

return

# prepare test data
def makedirectory(directory_name):
"""
Function: make directories
params : input directory
"""
if not os.path.exists(directory_name):
os.mkdir(directory_name)


# Get current working directory
present_directory = os.getcwd()

# change to directory provided
os.chdir(directory_name)

# Make two directories
os.mkdir('dir1')
os.mkdir('dir2')

# Make two same subdirectories
os.mkdir('dir1/common_dir')
os.mkdir('dir2/common_dir')

# Make two different subdirectories
os.mkdir('dir1/dir_only_in_dir1')
os.mkdir('dir2/dir_only_in_dir2')

# Make a unqiue file one each in directory
makefile('dir1/file_only_in_dir1')
makefile('dir2/file_only_in_dir2')

# Make a unqiue file one each in directory
makefile('dir1/common_file', 'Hello, Writing Same Content')
makefile('dir2/common_file', 'Hello, Writing Same Content')

# Make a non unqiue file one each in directory
makefile('dir1/not_the_same')
makefile('dir2/not_the_same')

makefile('dir1/file_in_dir1', 'This is a file in dir1')

os.mkdir('dir2/file_in_dir1')

os.chdir(present_directory)

return

if __name__ == '__main__':
os.chdir(os.getcwd())
makedirectory('example')
makedirectory('example/dir1/common_dir')
makedirectory('example/dir2/common_dir')
>
  • filecmpの例 filecmpの例を実行しています。浅い引数は、メタデータに加えて、ファイルの内容を確認するかどうかをcmp()に指示します。

デフォルトでは、os.stat()から入手できる情報を使用して浅い比較を実行します。結果が同じである場合、ファイルは同じであると見なされます。したがって、同時に作成された同じサイズのファイルは、内容が異なっていても同じものとして報告されます。

浅いがFalseの場合、ファイルの内容は常に比較されます。

import filecmp

print('Output \n *** Common File :', end=' ')

print(filecmp.cmp('example/dir1/common_file',
'example/dir2/common_file'), end=' ')

print(filecmp.cmp('example/dir1/common_file',
'example/dir2/common_file', shallow=False))

print(' *** Different Files :', end=' ')

print(filecmp.cmp('example/dir1/not_the_same',
'example/dir2/not_the_same'), end=' ')

print(filecmp.cmp('example/dir1/not_the_same',
'example/dir2/not_the_same', shallow=False))

print(' *** Identical Files :', end=' ')

print(filecmp.cmp('example/dir1/file_only_in_dir1',
'example/dir1/file_only_in_dir1'), end=' ')

print(filecmp.cmp('example/dir1/file_only_in_dir1',
'example/dir1/file_only_in_dir1', shallow=False))

出力

*** Common File : True True
*** Different Files : False False
*** Identical Files : True True
  • cmpfilesの例:

cmpfiles()を使用して、再帰せずに2つのディレクトリ内のファイルのセットを比較します。

import filecmp

import os

# Determine the items that exist in both directories.
dir1_contents = set(os.listdir('example/dir1'))
dir2_contents = set(os.listdir('example/dir2'))
common = list(dir1_contents & dir2_contents)

common_files = [f for f in common if os.path.isfile(os.path.join('example/dir1', f))]

print(f' *** Common files are : {common_files}')

# Now, let us compare the directories
match, mismatch, errors = filecmp.cmpfiles(
'example/dir1',
'example/dir2',
common_files,)

print(f' *** Matched files are : {match}')
print(f' *** mismatch files are : {mismatch}')
print(f' *** errors files are : {errors}')
*** Common files are : ['file_in_dir1', 'not_the_same', 'common_file']
*** Matched files are : ['common_file']
*** mismatch files are : ['file_in_dir1', 'not_the_same']
*** errors files are : []

7.ディレクトリの比較。

import filecmp
dc = filecmp.dircmp('example/dir1', 'example/dir2')
print(f"output \n *** Printing detaile report: \n ")
print(dc.report())
print(f"\n")
print(dc.report_full_closure())

出力

*** Printing detaile report:

diff example/dir1 example/dir2
Only in example/dir1 : ['dir_only_in_dir1', 'file_only_in_dir1']
Only in example/dir2 : ['dir_only_in_dir2', 'file_only_in_dir2']
Identical files : ['common_file']
Differing files : ['not_the_same']
Common subdirectories : ['common_dir']
Common funny cases : ['file_in_dir1']
None

diff example/dir1 example/dir2
Only in example/dir1 : ['dir_only_in_dir1', 'file_only_in_dir1']
Only in example/dir2 : ['dir_only_in_dir2', 'file_only_in_dir2']
Identical files : ['common_file']
Differing files : ['not_the_same']
Common subdirectories : ['common_dir']
Common funny cases : ['file_in_dir1']

diff example/dir1\common_dir example/dir2\common_dir
Common subdirectories : ['dir1', 'dir2']

diff example/dir1\common_dir\dir1 example/dir2\common_dir\dir1
Identical files : ['common_file', 'file_in_dir1', 'file_only_in_dir1', 'not_the_same']
Common subdirectories : ['common_dir', 'dir_only_in_dir1']

diff example/dir1\common_dir\dir1\common_dir example/dir2\common_dir\dir1\common_dir

diff example/dir1\common_dir\dir1\dir_only_in_dir1 example/dir2\common_dir\dir1\dir_only_in_dir1

diff example/dir1\common_dir\dir2 example/dir2\common_dir\dir2
Identical files : ['common_file', 'file_only_in_dir2', 'not_the_same']
Common subdirectories : ['common_dir', 'dir_only_in_dir2', 'file_in_dir1']

diff example/dir1\common_dir\dir2\common_dir example/dir2\common_dir\dir2\common_dir

diff example/dir1\common_dir\dir2\dir_only_in_dir2 example/dir2\common_dir\dir2\dir_only_in_dir2

diff example/dir1\common_dir\dir2\file_in_dir1 example/dir2\common_dir\dir2\file_in_dir1
None

さらに、Point1に記載されているすべてのコマンドを試して、各メソッドがどのように動作するかを確認できます。


  1. ディレクトリ内のPythonリストファイル:ステップバイステップガイド

    Python osライブラリは、ディレクトリ内のファイルを一覧表示するために使用されます。 Python os.listdir()メソッドは、ディレクトリ内のすべてのファイルとフォルダのリストを返します。 os.walk()関数は、ファイルツリー全体のすべてのファイルのリストを返します。 多くの場合、Pythonでファイルを操作しているときに、ディレクトリ内のファイルを一覧表示したい場合があります。たとえば、フォルダ内のすべてのPythonファイルを検索したい場合があります。 Python osライブラリには、ディレクトリ内のファイルを一覧表示するために使用できるいくつかのメソッドが

  2. PythonでPDFファイルをクラックする方法は?

    Pythonには、アプリケーションの作成と開発、Web開発、科学計算、ソフトウェアテスト、機械学習など、さまざまな目的で使用されるライブラリの豊富なコレクションがあります。 Pythonは、情報セキュリティの観点からシステムアプリケーションのテストと開発にも使用されます。ハッシュの作成、情報収集、情報検索、暗号化と復号化、Webクロール、なりすましなどに使用される特定のスクリプトを含む、利用可能な他のライブラリとツールがいくつかあります。 この記事では、パスワードで保護されたPDFドキュメントを復号化するプログラムを作成します。復号化には、いくつかの一般的なパスワードを含む単語リストを使用し