!!! サイト改修中のため表示が乱れる場合があります(1月末頃まで) !!!
解説

16-28. 破損したファイルをPythonでチェックする方法

やること

以前、こちらの記事で「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())

するとエラー内容がトレースできるようです。

リアクションのお願い

「参考になった!」「刺激された!」と思ったらぜひリアクションをしましょう。エンジニアの世界はGive and Takeによって成り立っています。これからも無料で良質な情報にアクセスできるよう、Giveする人への感謝をリアクションで示しましょう!

この記事をシェアする

自身のブログ等で使用する場合は引用を忘れずに!

また、寄付も受け付けています。コーヒー1杯でとても喜びます(*˘︶˘*)

 Amazonでギフト券(アマギフ)を贈る

こちらのリンク から金額を指定してお贈りください。(デフォルトで10000円になっているのでご変更ください)

配送:Eメール
受取人:staffあっとvigne-cla.com
贈り主:あなたのお名前やニックネーム
メッセージ:◯◯の記事が参考になりました。など

のようにご入力ください。見返りはありませんのでご了承ください。

 Amazonで食事券(すかいらーく優待券)を贈る

500円 1000円 2000円 5000円 からお贈りください。

配送:Eメール
受取人:staffあっとvigne-cla.com
贈り主:あなたのお名前やニックネーム
メッセージ:◯◯の記事が参考になりました。など

のようにご入力ください。見返りはありませんのでご了承ください。

 その他、ギフト券やクーポン券をメールで贈る

デジタルのギフト券/クーポン券はメールアドレス(staffあっとvigne-cla.com)までお送りください。受領の返信をいたします。
紙のギフト券/クーポン券は 「郵便物はこちらへ」の住所 まで送付してください。名刺やメールアドレスを同封していただければ受領の連絡をいたします。
余った株主優待券等の処理におすすめです。
いずれも見返りはありませんのでご了承ください。

不明点はSNSでお気軽にご連絡ください

ビネクラのTwitter・Youtubeでコメントをください!


Slack・Discordの場合はこちらの公開グループに参加してShoya YasudaまでDMをください!


※当ブログに関することは何でもご相談・ご依頼可能です。

この記事を書いた人
Yasuda

博士(理学)。専門は免疫細胞、数理モデル、シミュレーション。米国、中国で研究に携わった。遺伝的アルゴリズム信者。物価上昇のため半額弁当とともに絶滅寸前。

タイトルとURLをコピーしました