Python の警告を正しく無視する方法

Python を書いていると、解決できない警告や、あまり意味のない警告に出会うことがあります。たとえば、OpenPyxl を使っていた頃、次のような警告が何度も表示されました: warn("Workbook contains no default style, apply openpyxl's default")。この警告は、OpenPyxl が読み込んだファイルに既定のスタイルを自動で適用する、ということを知らせるものです。では、どう解決するのかというと、Office でその Excel ファイルを開いて保存し直せばよいのです。私の場合、プログラムは Excel ファイルの内容だけを使っていて、スタイルは結果に影響しないので、この警告はあまり重要ではありません。 警告が出たときは、私はいつも、なぜその警告が出ているのかを確認して考えるようにしています。自分に影響がないと確認できたら、コードの中で無視します。「この警告は重要ではない」と開発者が覚えておくことに頼るのではなく、です。単に見えなくするのではなく、「表示されたすべての警告に対処する」という良い習慣を身につけるためです。 ...

2023年3月12日 · 1 分

Python で進捗バーのような表示を出力する方法

少し前に、研究室のお菓子の会計ツールを開発していたときに学んだちょっとしたテクニックです。ターミナルで進捗バーのような表示、つまり「その場に文字を出力して、古い文字を消す」ことをしたい場合は、この記事を参考にしてください(ほかの言語でも同じ原理です)。 ...

2023年2月18日 · 1 分

Python の出力が tee で表示されない理由

最近 Python で Slack Bot を作りました。横着をして、log のメッセージを print でそのまま出力し、tee コマンドでファイルに保存していました。こうすると、コンソールで動作の情報を見ながら、同じ情報をファイルにも残せます。ところが Python の print() と tee を組み合わせて使うと、指定した log ファイルの中身がよく空っぽになったり、本来すぐ出るはずのメッセージがずっと後になって出てきたりしたのです。調べてみると、Python の print 関数は出力先を判断していることがわかりました。出力先が Shell であればすぐに出力されますが、そうでなければ一度 Buffer に溜めておき、バッファがいっぱいになってからまとめて出力されます。つまり Python を tee と組み合わせて使うと、このバッファの問題にぶつかり、期待した出力がすぐには画面にもファイルにも現れないのです。 ...

2018年6月16日 · 1 分

Python で日時の連続系列を生成する

Excel では、ドラッグするだけで連続した日付を簡単に生成できます。Python でも、datetime と timedelta という二つのモジュールを使えば、同じようなことができます。1時間おき、1日おき、1か月おきなど、どの間隔でも可能です。 ...

2017年7月30日 · 1 分

Python 3 で Windows のコマンドプロンプトに出力すると CP950 エラーになる

今日、後輩にプログラミングを教えていたときのことです。Python で中国語の文字をコマンドプロンプトに出力しようとしたところ、「UnicodeEncodeError: ‘cp950’ codec can’t encode character」というエラーが出てしまいました。いろいろな方法を試しても解決せず、最後はネットで調べてようやく原因がわかりました。 このエラーを見ると、経験のある開発者はすぐに文字列に特殊文字が含まれていると考え、ignore 引数を付けてみたりします。しかし、私の場合は効果がありませんでした。調べてみると、問題の原因は日本語の文字でした。Python 3 はデフォルトで Unicode 文字列を使うので、出力できないはずはないのですが……。まさか、あの悪名高い Big5 が原因なわけでもないですし……。 ...

2017年2月21日 · 1 分

ループの中でリストの要素を削除してはいけない

「何度踏んでも懲りない愚かな行為」を、また繰り返してしまいました。間違った書き方も一度経験すれば身につくはずだと思っていたのですが、今日も会社で3時間も地雷を踏んでしまいました。どこに問題があるのかさっぱりわからず、最後にあらためてコードを丁寧に読み直したところ……また同じ問題でした。一言でまとめると、「ループの中で配列の要素を削除してはいけない」です。 ...

2017年1月12日 · 1 分

Python でグローバル例外ハンドラーを設定する

通常、例外処理はグローバルに行うべきものではありません。例外処理をグローバルに適用すると、問題がどこで起きたのかを特定して対処するのが難しくなるからです。ただ、ごくまれにこのようなコードを書かなければならない場合があります。今回の例では、Python で webhook を処理するプログラムを書いていたのですが、サーバーから送られてくる情報が多種多様なため、例外が発生したときに環境データを出力して、後からデバッグできるようにする必要がありました。こういうときこそ、Global Exception Hook のテクニックを使うべきです。 ...

2017年1月2日 · 1 分

Python Join with Lambda - よりカスタマイズできる Join

プログラムを書く方なら、split() と join() はきっとおなじみでしょう。Python では String.join(list) を使って List を文字列に結合できます。たとえば “,".join([“A”, “B”, “C”]) は “A,B,C” という文字列を返します。逆に “A,B,C”.split(”,") を使えば List に分割できます。ただ、次のような、解決したくてもできなかった経験はありませんか? 文字列を結合するときに、各単語の先頭文字を大文字にしたい List に数値が入っているが、join で扱うには文字列にする必要がある これらの問題は List Comprehension で解決できます。たとえば型変換の部分は、次のように書けます。 nums = [1,2,3,4,5] nums_str = [str(num) for num in nums] print(",".join(nums_str)) では List Comprehension 以外に解決策はあるでしょうか? きっと、sort のように lambda 関数を join に渡せないかと考えたこともあるはずです!...

2016年12月13日 · 1 分

Python で漢語ピンインを処理する(氏名・住所の中国語→英語変換)

今日は同僚の手伝いで、大量の氏名と住所を中国語から英語に変換する必要が出てきたので、Python で漢語ピンインをどう扱えばよいかを調べてみました。まさか、一件ずつ郵便局のフォームやウェブサイトにコピーしていくわけにもいきませんからね(笑)。結果は意外なほど簡単でした。住所の翻訳は各社の Geocoder API で処理でき、漢語ピンインはサードパーティのライブラリを使えます。翻訳の精度もなかなか良好です。完璧とは言えませんが、人の手による「工人智慧」(「人工智慧」(AI)のもじり)と組み合わせれば、小さな欠点は十分にカバーできます。最後の小さな欠点を解消するには、膨大なリソースと技術を投入し、機械学習の手法を導入する必要があるでしょう。(実はいつか試してみたいと思っています。中国語圏では使える便利なツールが本当に少ないですから。) ...

2016年12月9日 · 1 分

elasticsearch.py を高速化する方法(バルク操作)

Python で Elasticsearch を操作するなら、公式の elasticsearch.py を入れることになるのは避けられません。最近、Python で Email Log を受け取って Elasticsearch に書き込む処理を作っていて、共有したい知見がかなりたまりました。AWS Lambda は実行時間で課金されるため、Lambda 関数を書くときは秒単位で気を遣います。0.5 秒を超えるたびに頭を抱えていました。そこで、最初は .index で1件ずつ挿入し、次に streaming_bulk を使い、最後はどうにも我慢できず parallel_bulk と streaming_bulk を組み合わせました。ここでは、これらの方法の違いと踏んだ落とし穴についてお話しします! ...

2016年12月8日 · 2 分