Python」カテゴリーアーカイブ

プログラミング言語「Python」に関するカテゴリーです。

Pythonで日付を扱う場合のTips

Pythonで日付を扱いたい場合、datetimeを使うと便利です。

使い方は次のような感じです。

文字列型とdatetime型の変換

datetime型から文字列型に変換

>>> import datetime
>>> date = datetime.datetime(2020, 2, 11)
>>> date.strftime('%Y/%m/%d')
'2020/02/11'

文字列型からdatetime型に変換

>>> datetime.datetime.strptime('2020/02/11', '%Y/%m/%d')
datetime.datetime(2020, 2, 11, 0, 0)

日数の差を計算

>>> date1 = datetime.datetime.(2020, 2, 11)
>>> date2 = datetime.datetime.(2019, 2, 11)
>>> (date1 - date2).days
365

何日か後の日付を計算

>>> date = datetime.datetime.(2019, 2, 11)
>>> date + datetime.timedelta(days=365)
datetime.datetime(2020, 2, 11, 0, 0)

月の日数を調べる

calendarを使って次のような感じで取得できます。

>>> import calendar
>>> calendar.monthrange(2020, 2)[1]
29

1年は12パターンしかありませんが、うるう年も計算してくれるので便利です。

リンク

datetime — Basic date and time types — Python 3.8.2 documentation
https://docs.python.org/3/library/datetime.html

calendar — General calendar-related functions — Python 3.8.2 documentation
https://docs.python.org/3/library/calendar.html

PythonのCGIでバイナリファイルを扱う場合の注意

PythonのCGIでバイナリファイルを扱う場合はprintで改行コードが追加されることに注意してください。

具体的には

print(open('/path/to/file', 'rb').read())

のようなスクリプト書いてファイルをダウンロードさせようとすると、元のファイルより1バイト分大きなファイルになってしまいます。

修正は例えば次のような感じです。

sys.stdout.write(open('/path/to/file', 'rb').read())

普段HTMLXMLなどを扱っている場合は改行コードで問題にならないので、バイナリファイルを扱う場合は気を付けてください。

リンク

cgi — Common Gateway Interface support — Python 3.8.1rc1 documentation
https://docs.python.org/3/library/cgi.html

Unsafe load call disabled by Gentoo

Gentoo Linux上でとあるPythonスクリプトを実行したところ

Error: Unsafe load() call disabled by Gentoo. See bug #659348

のようなエラーで実行できなくなってしまいました。


以前は問題なく動いていたスクリプトです。ということで少し調べてみたところ、下の件が関係しているような感じです。

659348 – (CVE-2017-18342)
https://bugs.gentoo.org/659348

とりあえず、簡単に修正したい場合はYAMLのload()を使っている部分をfull_load()safe_load()に書き換えてみると良いみたいです。