画像ファイルと動画ファイルの正常性をチェックするプログラム

ChatGPTに画像ファイル(JPG)と動画ファイル(MOV)が正常であるか確認するプログラムを作ってもらった。

プログラムを実行するOSはWindows10を指定したがプログラミング言語の指定は行わなかった。

画像ファイルと動画ファイルはUSBメモリーに保存している旨の指示は行った。

ChatGPTが提示したプログラムコードはPythonであった。

プログラムコードのファイル名:C:\XXXX\check_files.py

コードの終わりの部分でUSBメモリーのパスを指定しファイルを保存する。

このとき、¥(バックスラッシュ)を重ねないと正常に動作しなかった。

# USBメモリーのパスを指定
usb_directory = r"D:\path\to\usb" # 生文字列を使用してエスケープ処理を回避

¥を重ねる。

# USBメモリーのパスを指定
usb_directory = r"D:\\path\\to\\usb" # 生文字列を使用してエスケープ処理を回避

コマンドプロンプトcheck_files.pyを保存したフォルダにカレントディレクトリを変更しプログラムコードを実行する

cd C:\XXXX
python check_files.py

と入力しEnter。

実行結果はfile_check_results.txtというファイルに保存される。そのファイルはプログラムコードを保存したフォルダに格納される。

以下にプログラムコード(JPG、MOV対応版)を示す。プログラムの実行は確認したが、壊れたファイルが見つからなかったのでプログラムの動作は検証できていないことになる。

import os
import cv2
from PIL import Image

def check_jpg_file(file_path, log_file):
"""
JPGファイルの正常性をチェックし、結果をファイルに記録する関数
"""
try:
with Image.open(file_path) as img:
img.verify() # 画像ファイルの検証
result = f"{file_path} は正常です。\n"
except (IOError, SyntaxError) as e:
result = f"{file_path} は破損しているか無効です: {e}\n"

log_file.write(result) # ファイルに結果を記録
print(result.strip()) # コンソールにも表示
return result

def check_mov_file(file_path, log_file):
"""
MOVファイルの正常性をチェックし、結果をファイルに記録する関数
"""
try:
cap = cv2.VideoCapture(file_path)
if not cap.isOpened():
result = f"{file_path} を開けません。MOVファイルが破損している可能性があります。\n"
else:
result = f"{file_path} は正常です。\n"
except Exception as e:
result = f"{file_path} にエラーがあります: {e}\n"
finally:
cap.release()

log_file.write(result) # ファイルに結果を記録
print(result.strip()) # コンソールにも表示
return result

def check_files_in_directory(directory, log_file):
"""
指定されたディレクトリ内のすべてのMOVおよびJPGファイルをチェックし、結果をファイルに記録する関数
"""
for root, dirs, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
if file.lower().endswith('.jpg'):
check_jpg_file(file_path, log_file)
elif file.lower().endswith('.mov'):
check_mov_file(file_path, log_file)

if __name__ == "__main__":
# USBメモリーのパスを指定
usb_directory = r"D:\\path\\to\\usb" # 生文字列を使用してエスケープ処理を回避

# 結果を保存するためのファイルを開く
with open("file_check_results.txt", "w", encoding="utf-8") as log_file:
log_file.write("ファイルの正常性チェック結果:\n\n")

# ファイルの正常性をチェックして結果をファイルに保存
check_files_in_directory(usb_directory, log_file)

print("結果が 'file_check_results.txt' に保存されました。")

JPGとMOVだけでなく様々なファイルに対応するようにChatGPTに指示したところ、以下のようなプログラムコードが提示された。

対応する画像フォーマット:
JPG (.jpg, .jpeg)
PNG (.png)
BMP (.bmp)
GIF (.gif)
TIFF (.tiff)
その他、Pillowがサポートするフォーマット

対応する動画フォーマット:
MOV (.mov)
MP4 (.mp4)
AVI (.avi)
MKV (.mkv)
WMV (.wmv)
FLV (.flv)
その他、OpenCVがサポートするフォーマット

import os
import cv2
from PIL import Image

def check_image_file(file_path, log_file):
"""
画像ファイルの正常性をチェックし、結果をファイルに記録する関数
サポートするフォーマット: JPG, PNG, BMP, GIF, TIFF など
"""
try:
with Image.open(file_path) as img:
img.verify() # 画像ファイルの検証
result = f"{file_path} は正常です。\n"
except (IOError, SyntaxError) as e:
result = f"{file_path} は破損しているか無効です: {e}\n"

log_file.write(result) # ファイルに結果を記録
print(result.strip()) # コンソールにも表示
return result

def check_video_file(file_path, log_file):
"""
動画ファイルの正常性をチェックし、結果をファイルに記録する関数
サポートするフォーマット: MOV, MP4, AVI, MKV など
"""
try:
cap = cv2.VideoCapture(file_path)
if not cap.isOpened():
result = f"{file_path} を開けません。ファイルが破損している可能性があります。\n"
else:
result = f"{file_path} は正常です。\n"
except Exception as e:
result = f"{file_path} にエラーがあります: {e}\n"
finally:
cap.release()

log_file.write(result) # ファイルに結果を記録
print(result.strip()) # コンソールにも表示
return result

def check_files_in_directory(directory, log_file):
"""
指定されたディレクトリ内のすべての画像および動画ファイルをチェックし、結果をファイルに記録する関数
サポートする画像フォーマット: JPG, PNG, BMP, GIF, TIFF など
サポートする動画フォーマット: MOV, MP4, AVI, MKV など
"""
supported_image_formats = ('.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff')
supported_video_formats = ('.mov', '.mp4', '.avi', '.mkv', '.wmv', '.flv')

for root, dirs, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
# 画像ファイルのチェック
if file.lower().endswith(supported_image_formats):
check_image_file(file_path, log_file)
# 動画ファイルのチェック
elif file.lower().endswith(supported_video_formats):
check_video_file(file_path, log_file)

if __name__ == "__main__":
# USBメモリーのパスを指定
usb_directory = r"D:\\path\\to\\usb" # 生文字列を使用してエスケープ処理を回避

# 結果を保存するためのファイルを開く
with open("file_check_results.txt", "w", encoding="utf-8") as log_file:
log_file.write("ファイルの正常性チェック結果:\n\n")

# ファイルの正常性をチェックして結果をファイルに保存
check_files_in_directory(usb_directory, log_file)

print("結果が 'file_check_results.txt' に保存されました。")

ちなみにfile_check_results.txtに保存される実行結果の例は以下のようなものとなるらしい。

ファイルの正常性チェック結果:

D:\Folder1\image1.jpg は正常です。
D:\Folder1\video1.mp4 は正常です。
D:\Folder2\image2.png は破損しているか無効です: cannot identify image file
D:\Folder2\video2.mov を開けません。ファイルが破損している可能性があります。

実行してみたところ動作はしている。テキストファイルの拡張子をMOVに変えたファイルを紛れ込ませると、「ドキュメント.mov を開けません。ファイルが破損している可能性があります。」と記録された。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください