この記事は以下の方を対象としています。
・Pythonによる自動処理をされている方
・Pythonの異常停止への対応方法を知りたい方
・Pythonの運用中の停止で困っている方
本コラムのゴール
・Pythonの異常停止の原因を理解できる
・Pythonの異常停止への対応方法を理解できる
意外に多いPythonの運用中の停止
今回は、Pythonによる自動処理が途中で停止する問題について解説します。
Python や、RPAを活用されている方へのアンケートやインタビュー等を見ると、自動処理がたまに停止するというものを見かけることがあります。
自動処理が停止すると、その分、業務効率が低下します。しかし、事前に問題を予見し、その対策を講じることで、Pythonの安定稼働が可能となります。
今回は、その原因を解説します。原因をあらかじめ知っておくと、対策をすることができるようになります。
1.データに原因のある場合
プログラムとしては、普段は正常に操作するのに、まれにうまく動作しない原因として、データが問題となっている場合があります。以下に主なケースを解説します。
①文字コードが適切ではない場合
通常の業務をしていても文字化けすることがあります。これは、ソフトウェアで扱う文字コードと異なる文字コードのデータを取り扱うために発生します。
①-1 文字コードとは
文字コードとは、「あいうえお」や「ABC」、「123」といった文字を、コンピューターが理解できるように数値で表現したものです。これは一種の通し番号のようなものですが、複数の文字コード規格が存在するため、同じ数値でも異なる文字を表す場合があります。
WindowsではShift_JIS(CP932)という文字コードが広く使用されているのに対し、MacではUTF-8が一般的です。
①-2 Pythonで扱う文字コード
Pythonは基本的にUTF-8を使用します。そのため、Windowsから出力されたデータ(CSVファイル、テキストファイルなど)を何も指定せずに読み込むと、文字化けや処理エラーが発生する可能性があります。
①-3 パソコンのソフトウェア等を操作する場合
ExcelやWordのファイルの場合は、それぞれのアプリケーションが適切に文字コードを処理するため、通常は問題が生じません。このため、近年、文字化けに遭遇するケースは減少しています。これは、多くのソフトウェア、圧縮・解凍ツール、ブラウザが文字コードを自動判別し、適切に処理するようになったためです。
問題:
Pythonでデータを処理する際は、プログラム上で正しい文字コードを指定することが重要です。誤った文字コードを指定すると文字化けやプログラムが停止する可能性があります。
対策:
確実に正しい文字コードを指定しましょう。特に、異なるシステムやアプリケーションから得たデータを扱う場合は注意が必要です。
②全角半角の混在
問題:
データ中に全角文字と半角文字が混在していることで、予期せぬ動作を引き起こす可能性があります。
(例)
ひらがな/カタカナの全角と半角(が、ガ)
全角スペースと半角スペース
全角アルファベットと半角アルファベット
記号の全角と半角(@、@)
対策:
a)データの事前チェック、文字種の確認、修正
入力時または処理前に、文字を統一的な形式(全角または半角)に変換します。
b)プログラム内で文字種をチェック
プログラム内で文字種をチェックし、想定外の文字が含まれている場合はエラーを出力または適切に処理します。
c)適切なライブラリ等の使用
(例)
・ライブラリ(zenhan)等を用い、全角半角を統一します。
・unicodedataモジュール等を用い、文字の正規化を行います。
③ユニコード正規化
文字コードとは別に、ユニコード正規化に関する問題のケースもあります。
同じ文字が複数の方法(文字コード)で表現できるという問題です。
たとえば、「ガ」という文字には、「ガ」という1文字分の文字コードで定義されている場合もあれば、「カ」と「゛」の2文字分の文字コードで定義されている場合もあります。
問題:
正規化形式には、以下の場合があり、統一されていないと、同一文字として検索することができません。また、システムによっては、データの読み込みができません。
(例)
海外のシステムを使用するとき、日本語をUTF-8で扱っていても、正規化形式が異なる場合があります。
インターネット上の種々のサイトから情報を取得したとき、正規化形式の異なる文字列を含んでいる場合があります。
正規化形式
a) NFD (Normalization Form Decomposition):
文字を基底文字と結合文字に分解
b) NFC (Normalization Form Composition):
可能な限り文字を合成形式に変換
c) NFKD (Normalization Form Compatibility Decomposition):
互換分解を行い、より多くの文字を基本的な形に分解
d) NFKC (Normalization Form Compatibility Composition):
NFKDを適用後、可能な限り再合成
対策:
unicodedataモジュール等を用い、文字の正規化を行います。
NFKCに設定すると、濁点付きのカタカナは、全角1文字のカタカナになります。
数字は、半角の数字になります。以下で説明するnbspは、半角のスペースになります。
④nbsp(Non-Breaking SPace)による問題
nbspとは、テキストレイアウトで単語の分割を防ぐために使用される半角のスペースに見える空白のことです。半角の空白ですが、英単語等において、通常のスペースで改行されてしまうときでも、nbspは、改行されません。
問題:
見た目は通常の空白と同じですが、異なる文字コードを持つため、文字列比較や処理で予期せぬ結果を生む可能性があります。また、システムによっては、データの読み込みができません。
対策
テキスト処理の前に、nbspを通常の空白に置換することを検討します。
unicodedataモジュールを使うと、通常のスペースに変換することができます。
⑤データフォーマットの間違い
表形式のデータには各種のフォーマットがあります。
問題:
CSVファイルで受け取ったデータが、コンマ区切りではなく、タブ区切りやスペース区切りというケースもあります。データの形式が期待通りでないと、読み込み時にエラーが発生したり、データが正しく取り扱われない可能性があります。
(例)
・テキスト形式とCSVファイル
・CSVファイルとTSVファイル
対策:
データフォーマットの違いを処理するためには、以下の対策があります。
a)フォーマットを確認する
データを読み込む前に、ファイルのフォーマットを確認することが重要です。Pythonのcsvモジュールを使用する際に、区切り文字を指定するオプション(delimiter)があります。delimiterを指定することで、正しくデータを読み込むことができます。
b)データフォーマットの変換を行う
受け取ったデータが想定外のフォーマットであった場合、フォーマットを変換してから処理する方法もあります。例えば、タブ区切りのファイルをコンマ区切りに変換してから読み込むことで、標準的なCSVファイルとして扱うことができます。
これらの対策を講じることで、データに原因のある問題を未然に防ぎ、Pythonによる自動処理を安定稼働させることができます。
2.Pythonの動作が対象システムのレスポンスより早い
いわゆる「RPAの先走り」という問題は、PythonやRPAの動作がシステムの画面遷移よりも先行することを言い、業務システムの操作の際、PythonやRPAの自動処理でよく見られます。
①システムやネット―ワーク環境の動作速度に関する点
システムやネットワーク環境はいつでも同じ速度で動作するわけではなく、このため、ときとして、PythonやRPAの動作がシステムの画面遷移よりも先行することがあります。
問題:
業務用のシステムは、一般公開されている検索エンジンなどと異なり、企業の中で運用されています。このようなシステムは、ユーザの使用の大小によってレスポンスの影響を受けます。また、Pythonによる処理そのものが、影響してレスポンスに影響する場合もあります。自動処理だからと、人の何倍もの速度で業務用システムを操作しようとすると、場合によってはシステムがダウンする場合があります。
自動処理をPythonで行うとき、外部のインターネット上のサイトから情報を収集することについて、「1秒ごとの時間を空ける」との記述があるのを見たことがあります。しかしながら、企業の社内の業務用システムの場合、想定以上の負荷となるので、システム部門への確認、調整、許可が必要だと考えます。
1つの考え方としては、自動処理であっても、「人の操作するのと同じスピードで操作する」との考え方もあります。では、その「人の操作するのと同じスピードで操作する」であれば良いかというと、現実には、それでも異常停止するケースがあります。
24時間、週末も含めて自動処理を実施する場合、休日、夜間にシステムのメンテナンスをしていて、処理速度が低下する場合があります。
対策
1つの考えとしては、時間のかかる処理の待ち時間は、1分、3分待機するということも選択肢になります。何が原因かを特定するのは困難ですが、毎回、深夜の1時に異常停止するのであれば、この時間帯の処理の待ち時間を多めに指定して動作させるようにし、よく停止する時間帯の動作に余裕を持たせるのもよいと思います。
②Excelの保存時間
Excelファイルの保存時間が盲点となることがあります。
原因:
処理ステップごとにデータを保存することがよくありますが、処理が進むとデータサイズが増えて保存に時間がかかるようになります。また、数式が含まれていると、保存時に再計算が行われるため、処理開始時よりも保存に時間がかかることがあります。
対策
この点もシステム、ネットワークのレスポンスと同様に考慮する必要のある場合があります。
③PCのスペックの問題
PCを変更したときも影響が出ることがあります。
問題:
PCのスペックを変えるとWeb画面の表示時間が変わるので、Pythonが、システムの動作に対し、先走りを起こすことがあります。
対策
待機時間を変更する必要することで対応することができます。
まとめ
Pythonは、オープンソースソフトウェアなので、無償で使えることもあり、勉強する方、活用される方が増えています。乗り遅れることなく、この流れの中に入りましょう。
現在、Pythonを使っている方のお話を聞くと、Pythonの将来性を感じて勉強を始めたとのお話を聞きます。現在、人気の高いプログラミング言語であり、将来、活躍の幅が広がることと思います。
今回は、Pythonの自動処理、異常停止、その原因と対策について解説しました。
また、Pythonを活用した自動化ソリューションに興味がある方は以下のページをご覧ください。