やること
以前、こちらの記事で「try~exceptはファイルの破損状態の判別に使える」と紹介しました。
なぜtry~exceptを使わないといけないかというと、破損状態はファイル名やファイル容量から判別できず「とりあえず読み込んでみる」しかないからです。しかし読み込もうとするとエラーが起きてプログラムが止まってしまうので、例外処理でスルーするしかないというわけです。
今回は手短に画像ファイルとPDFファイルの破損状態の判別をしてみましょう。
実行環境
WinPython3.6をおすすめしています。
WinPython - Browse /WinPython_3.6/3.6.7.0 at SourceForge.net
Portable Scientific Python 2/3 32/64bit Distribution for Windows
Google Colaboratoryが利用可能です。
Google Colab
使用したファイル
サンプル画像(正常、破損)とサンプルPDF(正常、破損)の4つを置いておきます。PDFはオープンアクセスの論文を適当に選んだもので特に意味はありません。
画像ファイルの破損チェック
まずは画像のチェックです。ファイル名を切り替えてそれぞれ実行してみます。
import cv2
import matplotlib.pyplot as plt
#ファイル名
file = 'jpg_ok.jpg'
#file = 'jpg_broken.jpg'
try:
#読み込み
img = cv2.imread(file)
#表示
plt.imshow(img[:, :, [2, 1, 0]], vmin=0, vmax=255) #BGRをRGBで表示
plt.show()
print('Success in opening {}'.format(file))
except:
print('err in opening {}'.format(file))
Success in opening jpg_ok.jpg
err in opening jpg_broken.jpg
正常ファイルでは画像が表示され「Success」まで無事に実行されました、破損ファイルでは「img = cv2.imread(file)」のところでエラーが起きてexceptに飛びました。
PDFファイルの破損チェック
PDFの読み込みに「PyPDF2」を使用するためpipしておきます。
pip install PyPDF2
PDFファイルのチェックです。これもファイル名を切り替えてそれぞれ実行します。
import PyPDF2
#ファイル名
file = 'pdf_ok.pdf'
#file = 'pdf_broken.pdf'
try:
#読み込み
pdf_reader = PyPDF2.PdfFileReader(file)
#ページ数の表示
num = pdf_reader.getNumPages()
print(num)
print('Success in opening {}'.format(file))
except:
print('err in opening {}'.format(file))
9
Success in opening pdf_ok.pdf
err in opening pdf_broken.pdf
正常ファイルではページ数が表示され「Success」しましたが、破損ファイルでは「pdf_reader = PyPDF2.PdfFileReader(file)」のところでエラーが起きてexceptに飛びました。
おわりに
ただしこのままではどこでエラーが起きたか分からないので、except内で
print(sys.exc_info())
するとエラー内容がトレースできるようです。